1

我正在制作一个使用 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()应该立即结束程序,因为这可能是预期的行为。

谢谢!

4

1 回答 1

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()
于 2013-12-03T14:29:23.267 回答