Использование gevent monkey patching с резьбой делает работу нити серийно
Я использую 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()
to
monkey.patch_all(thread=False)
поэтому я не исправляю нить.
Ответы
Ответ 1
Когда потоки обезьяны заправлены в 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'