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