Ce genre de chose peut être réalisé avec des routines qui ont été intégrées à la distribution Python standard depuis la version 2.5. Si IronPython et co sont entièrement compatibles avec toutes les fonctionnalités de Python 2.5 (je crois qu'ils le sont), vous devriez être capable d'utiliser cet idiome.
Voir this post pour plus d'informations sur la façon dont ils peuvent être utilisés :) Plus précisément, vous serez intéressé par le PDF où l'auteur construit un système en utilisant rien d'autre que pur Python qui fournit des fonctionnalités similaires soit stackless Python ou le module Greenlet . Vous pouvez également rechercher Gogen ou Kamelia pour des idées: ces projets ont tous les deux des implémentations de pure corpore python que vous pouvez adopter ou utiliser comme référence pour votre propre implémentation. Jetez un oeil à this page pour une introduction douce à la cogen
façon de faire les choses.
Notez qu'il existe quelques différences entre les implémentations de co-routine ici et l'implémentation greenlet
. Les implémentations python pures utilisent toutes un type de planificateur externe, mais l'idée est essentiellement la même: elles vous offrent un moyen d'exécuter des tâches légères et coopératives sans recourir à des threads. En outre, les deux cadres liés à ci-dessus sont orientés vers des E/S asynchrones très similaires à greenlet
lui-même.
Voici l'exemple que vous avez publié, mais réécrites avec 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
Il est un peu plus explicite que la version greenlet
(par exemple en utilisant WaitForSignal
pour créer explicitement un point de reprise), mais vous devriez obtenir l'idée générale.
modifier: Je confirme que cela fonctionne en utilisant Jython
KidA% jython test.py
12
56
34
IronPython et Jython fonctionner sur les machines virtuelles qui sont entièrement filetés et ont leur propre IO appelle async - ne vous utilisez ceux? – Mark
En fin de compte oui, mais je pensais à écrire une version python pure avant d'ajouter les versions spécifiques à la machine virtuelle. Cette forme de contrôle de flux n'est pas complètement intuitive. – Tristan
Selon un commentaire sur l'une des réponses, votre but ultime est d'utiliser 'eventlet' dans IronPython ou Jython. Cela ne fonctionnera pas - pas à cause du 'greenlet's, mais à cause de' libevent', une bibliothèque C que 'eventlet' termine et dépend de sa boucle d'événement et de son réacteur. Vous pourriez éventuellement réimplémenter toute l'API 'libevent' en plus d'une boucle d'événements .NET ou Java native (du moins si vous ne vous souciez pas de la performance, comme vous ne le dites pas), mais c'est beaucoup de travail. – abarnert