终止已被deferredToThread的阻塞线程

时间:2014-02-26 05:16:19

标签: python twisted

如何修改此代码(使用扭曲),以便CTRL + C将导致它退出?我预计问题是doWork不会将控制权交还给反应堆,因此反应堆无法终止其执行。

def loop_forever():
    i = 0
    while True:
        yield i
        i += 1
        time.sleep(5)

def doWork():
    for i in loop_forever():
        print i

def main():
    threads.deferToThread(doWork)
    reactor.run()

请注意以下代码:

def main():
    try:
        threads.deferToThread(doWork)
        reactor.run()
    except KeyboardInterrupt:
        print "user interrupted task"

确实在Windows上捕获异常,但在ubuntu

上没有

1 个答案:

答案 0 :(得分:0)

Twisted使用Python的线程库来实现deferToThread。适用于Python线程的所有规则都适用于deferToThread获得的线程。一条规则是信号和线程组合不好(Ctrl-C在Linux上发送SIGINT)。

解决这个问题的基本思路是将一些逻辑放入doWork以便它将停止。也许这意味着设置一个全局标志,每次迭代检查一次。你可以在其他地方找到很多关于使长期运行的线程与shutdown配合的策略的信息。

您可能还希望使用deferToThread。如果您希望您的作业在该过程的大部分生命周期内运行,那么您可能只想直接使用stdlib threading模块。考虑这样的工作正在耗尽其中一个线程池插槽。如果你有足够的这些,那么你的线程池将会满了,其他工作将无法继续。

您可能还想将该帖子的doWork 带走。看起来它看起来不是很多阻塞。相反,在reactor线程中运行doWork并仅使用loop_forever运行deferToThread的迭代。现在,您不再需要在一个线程中进行长时间运行,并且您的一些问题可能会消失。