Erlang style concurrency in the D programming language

Убедитесь, что у вас есть ресурс, соответствующий масштабу изображения, который соответствует размеру экрана, который вы просматриваете в файле Interface Builder в XCode. Для ресурсов изображений есть точки @ 1x, @ 2x и @ 3x, если вы используете каталог ресурсов в XCode или, если вы его не используете, у вас должны быть разные ресурсы, различающиеся по имени файла (например, " image.png, image@2x.png, image@3x.png).

У вас может не быть нескольких размеров активов, и вы просто предоставили один ресурс, скажем, 1x или 3x, и вы можете просматривать экран в интерфейсе Builder для типа устройства, который использует другой размер актива и, таким образом, изображение UIImageView не будет отображаться в Xcode. Например, я просматривал интерфейс для iPhone 7, который использует 2x, но актив имел только 3x версия. Когда я добавил 2x версию, она сразу же появилась в Интерфейсном Разработчике в XCode.

Обратите внимание, что даже если он не рендерится в XCode, он все равно может отображаться правильно во время выполнения. Тем не менее, это хорошо практиковать предоставление ресурсов в разрешениях, которые будут подходить для каждой модели устройства.

25
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

По умолчанию хранилище является локальным по отношению к потокам в D, поэтому между потоками ничего не распределяется, если только оно не помечено как shared. Если вы пометите переменную как shared, вы можете использовать традиционные взаимные исключения и условия, а также синхронизированные объекты и тому подобное для работы с параллелизмом. Однако предпочтительным средством связи между потоками является использование средств передачи сообщений в std.concurrency, и все данные остаются локальными для потока, используя только shared, когда это необходимо. Все объекты, передаваемые между потоками с использованием std.concurrency, должны передаваться либо по значению, либо быть неизменяемыми, поэтому совместного использования там не происходит, и это полностью потоково-безопасно. Однако в настоящее время может быть немного сложно получить неизменяемый ссылочный тип, который не является массивом (idup обычно облегчает работу с массивами), поэтому может быть немного неприятно передавать что-либо, кроме типов значений или массивы (хотя мы надеемся, что ситуация улучшится в ближайшее время, когда ошибки компилятора и стандартной библиотеки, связанные с const и неизменяемыми, будут исправлены, и больше кода станет const-правильным).

Теперь, когда передача сообщений в D определенно приведет к более чистому и безопасному коду, чем то, что вы получили бы в таких языках, как C ++ или Java, он построен на поверх обычных потоков C (например, Linux). использует pthreads), поэтому он не имеет типа легких потоков, которые делает Erlang, и поэтому работа с несколькими потоками не будет столь же эффективной, как Erlang.

Конечно, я не вижу никакой причины, по которой более эффективная система потоков не могла бы быть написана с использованием D, и в этот момент вы могли бы получить эффективность потоков, аналогичную Erlang, и, возможно, она могла бы использовать API аналогично std.concurrency, но все стандартные потоки D построены поверх обычных потоков C, поэтому вам придется делать все это самостоятельно, в зависимости от того, как вы это реализовали, и от того, как именно Работа с thread-local / shared обрабатывается компилятором и druntime, может быть трудно заставить систему типов обеспечить, чтобы все было локально для потоков с вашими "зелеными" потоками. Боюсь, что я недостаточно знаю, как именно реализован shared или как работают «зеленые» потоки, чтобы знать наверняка.

Несмотря на это, система передачи сообщений D, безусловно, приведет к тому, что работа с потоками будет более приятной, чем в C ++ или даже Java, но она не предназначена для упорядочения таким же образом, как Erlang. D является системным языком общего назначения, а не языком, специально предназначенным для использования потоков для всего и, таким образом, для их максимально эффективного использования. Большая часть стандартных объектов D построена на основе C, поэтому многие ее характеристики эффективности будут аналогичны характеристикам C.

19
ответ дан 28 November 2019 в 21:40
поделиться

Из всего, что я знаю о D: его инфраструктура передачи сообщений построена поверх его потоковых средств. Если базовая библиотека потоков является оберткой для потоков ОС, маловероятно, что параллелизм в D достигнет величины (>> 10000) от Erlang. Более того, D не навязывает неизменность на объектах, поэтому легко все испортить. Таким образом, Erlang - лучший выбор для тяжелого параллелизма. Возможно, вы можете написать материал для параллелизма на Erlang, а остальную часть проекта на D. Тем не менее, возможно иметь эффективные зеленые потоки на C-подобных языках (C ++, D и т. Д.) - взгляните на Protothreads и ZeroMQ . Вы можете реализовать очень эффективные структуры обмена сообщениями, используя их и вызывая их через C-шим или непосредственно из D .

4
ответ дан 28 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: