gpt4 book ai didi

python - greenlet API的纯python实现

转载 作者:IT老高 更新时间:2023-10-28 20:47:41 27 4
gpt4 key购买 nike

greenlet包被 gevent 和 eventlet 用于异步 IO。它是作为 C 扩展编写的,因此不适用于 Jython 或 IronPython。如果不关心性能,那么在纯 Python 中实现 greenlet API 的最简单方法是什么。

一个简单的例子:

def test1():
print 12
gr2.switch()
print 34

def test2():
print 56
gr1.switch()
print 78

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()

应该打印 12、56、34(而不是 78)。

最佳答案

这种事情可以通过自 2.5 版开始内置到标准 Python 发行版中的协程来实现。如果 IronPython 和 co 完全兼容 Python 2.5 的所有特性(我相信它们是),那么您应该能够使用这个习惯用法。

this post有关如何使用它们的更多信息 :) 具体来说,您将对 PDF 感兴趣。作者只使用纯 Python 构建了一个系统,该系统提供了与无堆栈 Python 或 Greenlet 模块类似的功能。

您可能还想查看 GogenKamelia供想法:这些项目都有纯 python 协程实现,您可以采用或用作您自己实现的引用。看看this pagecogen 做事方式的简要介绍。

请注意这里的协程实现与 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 显式创建恢复点),但您应该了解大致的概念。

编辑:我刚刚确认这可以使用 jython

KidA% jython test.py 
12
56
34

关于python - greenlet API的纯python实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com