Эрлангский стиль параллелизма в языке программирования D - PullRequest
25 голосов
/ 25 октября 2010

Я думаю, что параллелизм в стиле Эрланга - это ответ на экспоненциальный рост числа ядер.Вы можете подделать его с другими языками основного потока.Но решения всегда оставляют меня в покое.Я не готов отказаться от многопарадигмального программирования (C ++ / D), чтобы перейти на драконовский синтаксис Эрланга.

Что такое параллелизм в стиле Эрланга:

От одного из авторов языка ( Какая на самом деле модель параллелизма Эрланга? ):

  • Облегченный параллелизм.
    Дешево создавать потоки и дешево поддерживать безумные числа.
  • Асинхронное общение.
    Потоки взаимодействуют только через сообщения.
  • Обработка ошибок.
  • Изоляция процесса.

Или от информированного блоггера ( Что такое параллелизм в стиле Erlang)? ):

  • Быстрое создание / уничтожение процессов
  • Возможность поддержки >> 10 000 одновременных процессов с практически неизменными характеристиками.
  • Быстрая асинхронная передача сообщений.
  • Копирование семантики передачи сообщений (параллелизм общего доступа).
  • Мониторинг процесса.
  • Выборочный прием сообщений.

Я думаю D's messageпередача может выполнить большинство из этих функций.Я задаюсь вопросом: « >> 10 000 одновременных процессов (потоков) » и « быстрое создание / уничтожение процессов ».

Насколько хорошо D справляется с этими требованиями?

Я думаю, что для их правильной поддержки вам придется использовать green threads .Можно ли использовать функции передачи сообщений D с библиотекой зеленых потоков?

Ответы [ 3 ]

19 голосов
/ 26 октября 2010

Хранилище по умолчанию является локальным для потока в 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, поэтому вам придется делать все это самостоятельно, в зависимости от того, как вы это реализовали, и от того, как именноЛокальные / shared вещи обрабатываются компилятором и druntime, может быть трудно заставить систему типов обеспечить, чтобы все было локально для потоков с вашими "зелеными" потоками.Боюсь, что я недостаточно знаю, как именно реализован shared или как работают «зеленые» потоки, чтобы знать наверняка.

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

7 голосов
/ 04 мая 2013

Эта функция часто используется в сочетании с асинхронным вводом-выводом, чтобы также эффективно взаимодействовать с внешними источниками данных.Платформа vibe.d предлагает модель потоков с множеством волокон на нескольких ОС и библиотеки асинхронного ввода-вывода (в дополнение к целому ряду библиотек веб-приложений и проектов).Инструменты управленияприложения в верхней части платформы.Другие популярные языки с похожими платформами (node.js, Ruby's EventMachine, сопрограммы в Python и Go) не могут конкурировать с D в низкоуровневом кодировании систем.Другие популярные языки с похожими средствами системного программирования (C, C ++) не могут конкурировать с высокоуровневым кодированием приложений.

Я новичок в D, но должен сказать, мне нравится то, что я вижу.*

4 голосов
/ 25 октября 2010

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

...