Есть ли эквивалент горутинов в D? - PullRequest
6 голосов
/ 07 декабря 2011

Я люблю Го, особенно горутины.Они просты и эффективны.После некоторого копания кажется, что они в основном являются волокнами, мультиплексированными в пул потоков ядра (поправьте меня, если я не прав).

При этом, существуют ли какие-либо стандартные библиотеки (или относительно популярные и поддерживаемые 3-ий?)партийные дополнения) в D?

Основные вещи, которые мне нужны:

  • Lightweight - потоки используют слишком много памяти и слишком много CPU
  • Simple- data-совместное использование не слишком важно, но простая передача сообщений
  • Managed - было бы хорошо, чтобы это было на уровне времени выполнения

Основная цель здесь состоит в том, чтобывеб-сервер максимально эффективно конкурировать со скоростью Node.js и Go.Это означает, что может быть много активных соединений (http, websockets, потоковая передача данных).

Мне нравятся вещи о других упомянутых платформах, но D гораздо более обобщен.Если бы это не было слишком неуклюже, я бы выбрал D над остальными.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Нет ничего в точности эквивалента, но есть два модуля, которые могут предоставить что-то достаточно похожее для ваших нужд:

  1. std.concurrency обеспечиваетпередача сообщений и гарантированная изоляция, если только квалификатор shared не используется для получения очень ограниченной явной разделяемой памяти.Тем не менее, вы (пока) не получаете мультиплексирование волокон на потоки, которые предоставляют goroutines.Прямо сейчас каждый вызов spawn запускает новый поток ОС.Кроме того, еще предстоит проделать определенную работу, чтобы сделать пригодность неизменяемости достаточной, чтобы эта парадигма достигла своего полного потенциала.Подробнее об этой парадигме см. В бесплатной главе «Языка программирования D» Андрея Александреску.

  2. std.parallelism содержит задачи.Он ориентирован на параллелизм, а не на параллелизм. (Это не одно и то же, даже если вам нужен параллелизм для реализации параллелизма.) Поэтому вместо передачи сообщений задача просто выполняется без связи с вызывающим потоком, а затем возвращает возвращаемое значение вызывающемунить.Кроме того, если задач больше, чем потоков, избыточные задачи ставятся в очередь, а не мультиплексируются с использованием волокон.

Редактировать: я изначально разработал и написал std.parallelism и готов рассмотреть запросы на расширениедля удовлетворения потребностей, таких как ваша, при условии, что они не расширяют область действия модуля до уровня параллелизма в общем случае.Если std.parallelism делает почти то, что вам нужно, но не совсем, пожалуйста, опубликуйте запрос функции здесь или в новостной группе digitalmars.d.

Кроме того, хотя я, скорее всего, не буду исполнителем такого запроса, не стесняйтесь предлагать улучшения для std.concurrency.

2 голосов
/ 07 декабря 2011

std.parallel использует пулы потоков для выполнения задач, однако вам нужно будет реализовать свои собственные процедуры передачи сообщений (в настоящее время в библиотеке AFAIK нет очереди, безопасной для потоков)

0 голосов
/ 07 декабря 2011

Я не знаю, может ли библиотека D обеспечить поддержку разделенных стеков (для потоков / волокон). Без этого, к сожалению, многие полезные функции Go будут потеряны.

Если какую-то проблему легко / лучше решить с помощью goroutines, то почему бы просто не использовать Go в первую очередь?

...