使用gevent monkey修补与线程使线程连续工作

yos*_*ssi 22 python multithreading gevent

我正在使用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'
Run Code Online (Sandbox Code Playgroud)

所以线程没有按预期工作.
但如果我删除monkey.patch_all()它,它工作正常.
问题是我需要monkey.patch_all()使用gevent(现在在上面的代码中显示)

我的解决方案

我改变了

monkey.patch_all() 
Run Code Online (Sandbox Code Playgroud)

monkey.patch_all(thread=False)
Run Code Online (Sandbox Code Playgroud)

所以我不修补线程.

jco*_*ado 26

当线程在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'
Run Code Online (Sandbox Code Playgroud)

  • @yossi如果你的任务需要很长时间才能完成,并且在某些时候无法控制,那么你需要真正的线程而不是协同程序.在这种情况下,我会说你最好不修补线程. (3认同)