Языки сценариев, поддерживающие волокна / сопрограммы?

Я хотел бы начать новый проект сетевого сервера на языке, который поддерживает параллелизм через волокна, также известные как сопрограммы или потоки пользовательского режима. Определить, какие именно варианты у меня есть, было чрезвычайно сложно, поскольку термин «сопрограмма», кажется, используется довольно свободно для обозначения множества вещей, а «волокно» используется почти исключительно в отношении Win32 API.

Для целей этого вопроса сопрограммы / волокна:

  • методы поддержки, которые приостанавливают выполнение, передавая результат вызывающей функции из вложенной функции (т. е. произвольно глубоко в стеке вызовов, откуда была вызвана сопрограмма / волокно)
  • поддержка передачи управления другой произвольной сопрограмме в ее текущей точке выполнения (т.е. уступить сопрограмме, которая не вызвала вашу сопрограмму)

Какие у меня варианты языка? Я знаю, что у Ruby 1.9 и Perl (Coro) есть поддержка, что еще? Достаточно всего, что имеет зрелый gc и вызов динамических методов.


person Logan Bowers    schedule 24.12.2009    source источник


Ответы (5)


Расширение greenlet соответствует вашим требованиям в Python (обычное, а не Stackless).

Greenlet API является немного низкоуровневым, поэтому я рекомендую использовать gevent, который предоставляет API, подходящий для приложения. (Отказ от ответственности: я написал gevent)

person Denis Bilenko    schedule 02.01.2010
comment
+1, гринлет - это качество, но gevent не поддерживает питон 3 - person Matt Joiner; 19.09.2011

Lua поддерживает сопрограммы, см. http://lua-users.org/wiki/CoroutinesTutorial, дайте это попытка!

person Kknd    schedule 24.12.2009
comment
Поиграв с учебным кодом, Lua явно не справляется со вторым требованием. - person Logan Bowers; 24.12.2009

Tcl 8.6, который в настоящее время находится в стадии бета-тестирования, будет поддерживать сопрограммы. Для получения дополнительной информации см. страницу сопрограмм Tcl Wiki

person Colin Macleod    schedule 03.09.2010

Stackless Python - еще один вариант, отвечающий вашим требованиям. Если Python, Ruby и Perl не подходят для ваших целей (несмотря на то, что все они соответствуют заявленным вами требованиям), у вас, вероятно, есть другие неустановленные требования или предпочтения - не забудьте их изложить? -)

person Alex Martelli    schedule 24.12.2009
comment
Я хочу оценить все свои возможности, прежде чем выбирать язык. Я не сразу выбираю ruby, потому что сборщик мусора может быть довольно медленным с большими кучами, и я не сразу выбираю Perl из-за его относительно уродливого синтаксиса. Тем не менее, Perl в настоящее время является лидером. - person Logan Bowers; 24.12.2009
comment
Кроме того, знаете ли вы, подходит ли PEP 342 для обычного Python? send () кажется шагом в правильном направлении, но я не могу сказать, возможна ли уступка из глубины стека вызовов. - person Logan Bowers; 24.12.2009
comment
@Logan, генератор Python может уступить только своему вызывающему, а не какому-либо другому месту - в любом случае для построения системы сопрограмм используется конфигурация трамплина, как показано в примере 3 в PEP 342. - person Alex Martelli; 24.12.2009

В схеме есть call-with-current-continuation, который является строительным блоком, на котором могут быть построены все виды управления потоком. Он определенно может поддерживать два упомянутых вами использования.

Существует множество надежных, широко доступных реализаций Scheme, таких как PLT Scheme и Цыпленок.

person Greg Hewgill    schedule 24.12.2009
comment
У Ruby тоже есть callcc. Но не очень быстро, потому что копирует весь стек C. - person pts; 30.11.2010