python ironpython jython

cpython



Implementación de Python pura de la API de Greenlet (2)

Este tipo de cosas se puede lograr con co-rutinas que han sido incorporadas a la distribución estándar de Python desde la versión 2.5. Si IronPython y compañía cumplen con todas las funciones de Python 2.5 (creo que sí), deberías poder usar este idioma.

Consulte esta publicación para obtener más información sobre cómo se pueden usar :) Específicamente, le interesará el PDF donde el autor construye un sistema utilizando únicamente Python puro que proporciona capacidades similares a Python sin pila o al módulo Greenlet.

También puede buscar ideas de Gogen o Kamelia : ambos proyectos tienen implementaciones de Python Coroutine que puede adoptar o utilizar como referencia para su propia implementación. Eche un vistazo a esta página para obtener una introducción suave a la forma cogen de hacer las cosas.

Tenga en cuenta que hay algunas diferencias entre las implementaciones de la co-rutina aquí y la implementación de greenlet . Todas las implementaciones de python puras utilizan algún tipo de planificador externo, pero la idea es esencialmente la misma: le proporcionan una forma de ejecutar tareas ligeras y cooperativas sin la necesidad de recurrir a subprocesos. Además, ambos marcos vinculados a los anteriores están orientados a la IO asíncrona de manera muy similar a la de greenlet .

Aquí está el ejemplo que publicaste pero reescribiste usando 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

Es un poco más explícito que la versión de greenlet (por ejemplo, utilizando WaitForSignal para crear explícitamente un punto de reanudación), pero debería tener una idea general.

Edición: acabo de confirmar que esto funciona usando jython

KidA% jython test.py 12 56 34

El paquete greenlet es utilizado por gevent y eventlet para IO asíncrono. Está escrito como una extensión C y, por lo tanto, no funciona con Jython o IronPython. Si el rendimiento no es importante, ¿cuál es el enfoque más sencillo para implementar la API de greenlet en Python puro?

Un ejemplo simple:

def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1.switch() print 78 gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()

Debe imprimir 12, 56, 34 (y no 78).


No es posible implementar greenlet en Python puro.

ACTUALIZAR:

  • La falsificación de la API de Greenlet con subprocesos podría ser factible, incluso si es completamente inútil para todos los propósitos prácticos.
  • Los generadores no se pueden usar para esto, ya que solo guardan el estado de un solo cuadro. Greenlets guardan toda la pila. Esto significa que gevent puede usar cualquier protocolo implementado en la parte superior del zócalo estándar (por ejemplo, módulos httplib y urllib2). Los marcos basados ​​en generadores requieren generadores en todas las capas de su software, por lo que httplib y toneladas de otros paquetes se desechan.