我试图弄清楚Gevent与python中的其他异步框架(如Twisted )是如何工作的。
Gevent和Twisted之间的关键区别在于Gevent使用了用于隐式行为和同步编程模型的标准库补丁,而Twisted则需要特定的库和显式行为的回调。Gevent中的事件循环是libev/libevent,用C编写,Twisted中的事件循环是用python编写的反应器。
libev/libevent有什么特别的地方允许这种隐式行为吗?为什么不使用用Python编写的事件循环呢?相反,为什么不使用libev/libevent来扭曲?有什么特别的原因吗?也许这只是一个设计上的选择,可以走任何一条路.
理论上,Gevent的libev能否被另一个用python编写的事件循环所替代,就像Twisted的反应堆一样?Twisted的反应堆能用libev代替吗?
发布于 2022-02-08 11:24:24
简短答案:Twisted是一个网络框架。Gevent试图充当一个库,而不要求程序员改变他的编程方式。这就是他们的焦点..。更不要说这是如何在引擎盖下实现的。
长答案
所有异步库(Gevent、Asyncio等)工作方式大致相同:
greenlet是一个不同的库。它非常简单,因为它只是改变了Python代码的运行顺序,并允许您在函数之间来回跳。Gevent在幕后使用它来实现它的异步特性。
asyncio随Python3而来,就像gevent一样。最大的区别是接口再次出现。它要求程序员用async标记函数,并允许他显式地等待await主循环中订阅的函数。
Gevent就像异步。但是,它不是关键字,而是在适当的地方对现有代码进行修补。它使用引擎盖下的greenlet在主循环和订阅函数之间切换,使所有功能都能无缝地工作。
如前所述,扭曲感觉更像是一个框架,而不是一个库。它要求程序员遵循非常具体的方法来实现并发。尽管如此,它在引擎盖下还有一个名为reactor的主循环,就像其他所有东西一样。
回到你最初的问题:理论上,你可以用任何回路(包括gevent)替换反应堆。但那会使目的落空。由于优化的原因,Twisted的团队可能决定使用他们自己版本的主循环。所有这些库在它们的主循环中使用不同的调度来满足它们的需求。
https://stackoverflow.com/questions/37629312
复制相似问题