Ответ 1
Этот вид может быть достигнут с помощью совлокальных подпрограмм, которые были встроены в стандартный дистрибутив Python с версии 2.5. Если IronPython и co полностью совместимы со всеми функциями Python 2.5 (я считаю, что они), вы должны использовать эту идиому.
Смотрите этот пост для получения дополнительной информации о том, как их можно использовать:) В частности, вас будет интересовать PDF, где автор строит систему, используя только чистый Python, который предоставляет аналогичные возможности как без стекового Python, так и модуля Greenlet.
Вы также можете посмотреть Gogen или Kamelia для идей: эти проекты имеют чистые реализации python coroutine, которые вы могли бы использовать или использовать в качестве ссылки для своей собственной реализации. Взгляните на эту страницу за нежное введение в способ cogen
делать вещи.
Обратите внимание, что здесь существуют некоторые различия между реализациями подпрограмм и реализацией greenlet
. Чистые реализаторы python используют какой-то внешний планировщик, но идея по сути одна и та же: они предоставляют вам возможность запускать легкие, совлокальные задачи без необходимости прибегать к потокам. Кроме того, обе структуры, связанные с выше, ориентированы на асинхронный IO, очень похожий на 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