我正在使用gevent,我正在修补所有的东西。
它看起来像是猴子补丁导致线程串行工作。
我的代码:
import threading
from gevent import monkey; monkey.patch_all()
class ExampleThread(threading.Thread):
def run(self):
do_stuff() # takes a few minutes to finish
print 'finished working'
if __name__ == '__main__':
worker = ExampleThread()
worker.start()
print 'this should be printed before the worker finished'
所以线程并没有像预期的那样工作。
但是如果我移除monkey.patch_all()
,它工作得很好。
问题是我需要monkey.patch_all()
来使用gevent (现在显示在上面的代码中)
我的解决方案:
我更改了
monkey.patch_all()
至
monkey.patch_all(thread=False)
所以我不是在修补线程。
发布于 2012-02-08 20:02:48
当线程在gevent中被猴子修补时,它们的行为就像协程一样。这意味着您必须显式地让出控制,以使其他协程能够执行。
执行此操作方法是调用已打补丁的阻塞操作(这将自动生成)或gevent.sleep
#!/usr/bin/env python
from gevent import monkey, sleep
monkey.patch_all()
import threading
class ExampleThread(threading.Thread):
def run(self):
for i in xrange(10):
print 'working'
sleep()
if __name__ == '__main__':
worker = ExampleThread()
worker.start()
print 'this will be printed after the first call to sleep'
发布于 2018-06-08 06:27:26
如果将Thread
替换为Greenlet
,则可以保留基于线程的类,例如:
from gevent import monkey
from gevent import Greenlet
from threading import Thread
class ThreadLikeGreenlet(Greenlet):
def __init__(self, name=None, target=None, args=(), kwargs=()):
super().__init__(target, *args, **dict(kwargs))
self.name = name
def is_gevent_patched():
return monkey.is_module_patched('threading')
if is_gevent_patched():
Thread = ThreadLikeGreenlet # substitute Thread with Greenlet
class ExampleThread(Thread):
...
那么它就会像你所希望的那样工作。
https://stackoverflow.com/questions/9192539
复制相似问题