过去一周我一直在挖掘我们的代码库,我似乎无法弄明白。基本上,我有一个调度程序可以产生一堆工人,我想引入一个功能,一旦收到信号(比如SIGINT或SIGTERM),工人就会有一个宽限期(比如说60秒)完成他们的工作,然后死。如果所有工作人员在宽限期过去之前完成工作,那么该过程应该超时然后在那里死亡。给你一个想法 -
在日程安排程序中 -
.
.
.
gevent.joinall(map(lambda t: gevent.spawn(t), get_workers()))
在工人中 -
def activate(termination_grace_period=60):
global CURRENT
global GRACE_PERIOD
GRACE_PERIOD = termination_grace_period
CURRENT = gevent.getcurrent()
signal.signal(signal.SIGINT, die)
def die(signal=None, stack_trace=None):
global GRACE_PERIOD
global TASKS
try:
with gevent.timeout.Timeout(GRACE_PERIOD) as timeout:
while TASKS:
gevent.idle()
exit(0)
except (gevent.timeout.Timeout, gevent.hub.BlockingSwitchOutError):
exit('exit 1')
except Exception as e:
print 'e was', repr(e)
exit('Machiatto')
因此在调度程序中,我将从worker中导入activate()
方法,并在我生成worker之前调用它。
我遇到了您在except
die()
区块中看到的所有例外情况,并且该过程当然不会超时;相反,它会抛出一个异常,然后死掉。主要过程当然是scheduler
,我从shell中调用了所有相关参数(特别是宽限期),因此我不排除{ {1}}处理程序应该以{{1}}开头,因为无论如何所有信号处理程序都在主线程中执行,如果我设法终止进程,它的所有子线程都会死掉反正。
如果有人对如何正确连接这个逻辑有任何见解,那将非常感激。
干杯