我在概念化greenlet的大问题上遇到了一些麻烦。我理解在同一过程中切换运行功能的能力如何打开通往充满可能性的世界的大门;但是我还没有遇到任何例子来说明它们如何解决标准python技术无法解决的问题(除了生成器中的嵌套函数问题——老实说……)。
以greenlet的主页为例,这基本上是一种更复杂的方式:
def test0():
print 12
print 56
print 34
我知道这只是一个多余的例子,但这似乎是什么绿能做的长和短。除非你是一个控制狂,你必须决定何时、何地以及如何执行应用程序中的每一行代码,那么使用greenlet是如何改进test0
的呢?或者以GUI为例(这是我最初对greenlet感兴趣的地方);考虑一个不需要在process_commands
中使用while
循环的策略应该不难,不是吗?
我已经看到了一些很酷的事情可以用greenlet完成;但只能与其他一些在另一个包中实现的黑暗魔法(例如,Stackless, gevent等)相结合。即使有了这些,greenlet也是不够的,需要它们子类化。
我的问题:
关于如何使用greenlet来增强python的功能,有哪些实际的例子?我怀疑答案在于人脉——这可能是我不明白的原因。但是还有其他的吗?
注意,您的示例已显式地将所有print
组合到一个函数中。在一个真正的程序中,你不只是有两个函数;你有一些任意数量的函数,其中一些甚至来自你无法控制的第三方库,重写所有的代码来交错所有的语句并不是那么简单。
GUI实际上是一个很好的例子:当没有事件要读取时,通过让事件循环(这是您在实践中处理命令的方式,顺便说一句)挂起自己,您的GUI可以在同一线程上保持交互。如果事件循环实际上必须停止并等待用户按下一个键,那么您的GUI将冻结,因为没有任何东西会告诉操作系统重新绘制窗口。
并不是说我特别喜欢gevent;我把赌注押在stdlib asyncio库上。:)但这其实都是同一个想法:当你有一些工作要做,需要很多等待,让其他代码在此期间运行。
本质上是你不想在等待某些东西返回时阻塞应用程序的其他部分的任何问题。(如sleep
, socket
)。或者换句话说,任何问题,事件驱动的开发将使事情变得更容易。
- GUI。
- 模拟/游戏,你可能有1000个演员,你希望他们独立行动。
- 与异步库/框架的同步绑定