Python gevent优雅地杀死工人

Python gevent优雅地杀死工人,python,multithreading,concurrency,timeout,gevent,Python,Multithreading,Concurrency,Timeout,Gevent,在过去的一周里,我一直在挖掘我们的代码库,但我似乎真的弄不明白。基本上,我有一个调度器,它可以生成一组工作人员,我想介绍一个特性,在接收到信号(比如SIGINT或SIGTERM)时,工作人员有一个宽限期(比如60秒)来完成他们的工作,然后死亡。如果所有工人都在宽限期结束之前完成了工作,则该过程应暂停,然后死亡。给你一个主意-- 在调度程序中-- 在工人中-- 因此,在调度程序中,我将从worker导入activate()方法,并在生成worker之前调用它。 我遇到了您在中看到的所有异常,除了d

在过去的一周里,我一直在挖掘我们的代码库,但我似乎真的弄不明白。基本上,我有一个调度器,它可以生成一组工作人员,我想介绍一个特性,在接收到信号(比如SIGINT或SIGTERM)时,工作人员有一个宽限期(比如60秒)来完成他们的工作,然后死亡。如果所有工人都在宽限期结束之前完成了工作,则该过程应暂停,然后死亡。给你一个主意--

在调度程序中--

在工人中--

因此,在调度程序中,我将从worker导入
activate()
方法,并在生成worker之前调用它。 我遇到了您在
中看到的所有异常,除了
die()
中的
块,而且进程肯定不会超时;相反,它将抛出一个异常,然后死亡。主进程当然是
调度程序
,我从shell调用它,比如说,使用所有相关参数(特别是宽限期),因此我不排除
die()
处理程序首先应该位于
调度程序
中的可能性,由于所有信号处理程序都会在主线程中执行,如果我设法终止该进程,那么它的所有子线程都会死掉

如果有人对我如何正确地连接这个逻辑有任何见解,我将不胜感激

干杯

.
.
.
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')