允许Greenlet在主模块执行结束时完成工作

时间:2013-10-17 22:54:45

标签: python gevent

我正在创建一个使用gevent来异步执行某些工作的库。我想保证工作完成,即使主模块完成执行。

class separate_library(object):
    def __init__(self):
        import gevent.monkey; gevent.monkey.patch_all()

    def do_work(self):
        from gevent import spawn
        spawn(self._do)

    def _do(self):
        from gevent import sleep
        sleep(1)
        print 'Done!'

if __name__ == '__main__':    
    lib = separate_library()
    lib.do_work()

如果你运行它,你会发现程序立即结束,并且Done!没有打印出来。

现在,主模块不知道或关心separate_library实际完成工作的方式(甚至是gevent正在使用的工作),因此要求加入那里是不合理的。

separate_library是否可以检测某些类型的程序退出,并在工作完成之前停止?键盘中断,SIGINT和sys.exit()应立即结束程序,因为这可能是预期的行为。

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试使用一个不是守护程序线程的新线程来生成你的gevent线程。由于此非守护程序线程,您的程序不会退出。

import gevent
import threading

class separate_library(object):
    def __init__(self):
        import gevent.monkey; gevent.monkey.patch_all()

    def do_work(self):
        t = threading.Thread(target=self.spawn_gthreads)
        t.setDaemon(False)
        t.start()


    def spawn_gthreads(self):
        from gevent import spawn
        gthreads = [spawn(self._do,x) for x in range(10)]
        gevent.joinall(gthreads)

    def _do(self,sec):
        from gevent import sleep
        sleep(sec)
        print 'Done!'

if __name__ == '__main__':    
    lib = separate_library()
    lib.do_work()