使用修补线程与原生gevent greenlets的缺点?

kdt*_*kdt 5 python gevent python-multithreading

我的理解是,一旦我调用gevent.monkey.patch_all(),标准线程模块就会被修改为使用greenlets而不是python线程.因此,如果我根据python线程,锁,信号量等编写我的应用程序,然后调用patch_all,我是否获得了gevent的全部好处,或者与使用显式gevent等价物相比,我是否会失去某些东西?

这个问题背后的动机是我正在编写一个使用一些线程/ greenlets的模块,我决定在使用gevent和使用线程之间进行显式切换是否有用,或者我是否可以使用线程+ patch_all而不会丢失任何东西.

把它放在代码中,是这个......

def myfunction():
  print 'ohai'

Greenlet.spawn(myfunction)
Run Code Online (Sandbox Code Playgroud)

......这有什么不同吗?

import gevent.monkey
gevent.monkey.patch_all()
def mythread(threading.Thread):
  def run(self):
    print 'ohai'

mythread().start()
Run Code Online (Sandbox Code Playgroud)

Fed*_*lev 2

至少你会失去一些特定于 greenlet 的方法:link、kill、join 等。此外,你不能将线程与 gevent.pool 模块一起使用,这可能非常有用。创建 Thread 对象的开销非常小。