Подобного можно добиться с помощью подпрограмм, встроенных в стандартный дистрибутив Python начиная с версии 2.5. Если IronPython и co полностью совместимы со всеми функциями Python 2.5 (я верю, что они есть), вы сможете использовать эту идиому.
См. этот пост для получения дополнительной информации о том, как их можно использовать :) В частности, вас заинтересует PDF , где автор строит систему, используя только чистый Python это обеспечивает аналогичные возможности либо для стека Python, либо для модуля Greenlet.
Вы также можете поискать идеи либо: Gogen , либо Kamelia : оба эти проекта имеют чистые реализации сопрограмм Python, которые вы можете либо принять, либо использовать в качестве ссылки для собственной реализации , Взгляните на эту страницу , чтобы получить представление о том, как cogen
делать что-то.
Обратите внимание, что здесь есть некоторые различия между реализациями подпрограммы и реализацией greenlet
. Все реализации на чистом Python используют какой-то внешний планировщик, но идея по сути та же: они дают вам возможность выполнять легкие совместные задачи без необходимости прибегать к потокам. Кроме того, обе платформы, связанные с вышеупомянутыми, ориентированы на асинхронный ввод-вывод, очень похожий на greenlet
.
Вот пример, который вы опубликовали, но переписали, используя cogen
:
from cogen.core.coroutines import coroutine
from cogen.core.schedulers import Scheduler
from cogen.core import events
@coroutine
def test1():
print 12
yield events.AddCoro(test2)
yield events.WaitForSignal(test1)
print 34
@coroutine
def test2():
print 56
yield events.Signal(test1)
yield events.WaitForSignal(test2)
print 78
sched = Scheduler()
sched.add(test1)
sched.run()
>>> 12
>>> 56
>>> 34
Это немного более явно, чем версия greenlet
(например, использование WaitForSignal
для явного создания точки возобновления), но вы должны понять общую идею.
edit: я только что подтвердил, что это работает с использованием jython
KidA% jython test.py
12
56
34