Python gevent优雅地杀死了工人

时间:2016-10-02 15:24:02

标签: python multithreading concurrency timeout gevent

过去一周我一直在挖掘我们的代码库,我似乎无法弄明白。基本上,我有一个调度程序可以产生一堆工人,我想引入一个功能,一旦收到信号(比如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​​}}开头,因为无论如何所有信号处理程序都在主线程中执行,如果我设法终止进程,它的所有子线程都会死掉反正。

如果有人对如何正确连接这个逻辑有任何见解,那将非常感激。

干杯

0 个答案:

没有答案