Подтвердить что ты не робот

Использование 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)

поэтому я не исправляю нить.

4b9b3361

Ответ 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'