繁体   English   中英

终止已被deferredToThread阻塞的线程

[英]Terminating blocking thread that has been deferredToThread

如何修改此代码(使用扭曲的代码),以便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上却没有

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

解决此问题的基本思想是将一些逻辑放入doWork ,以使其停止运行。 也许这意味着设置一个全局标志,它在每次迭代中都会检查一次。 在其他地方,您可能会找到许多有关获取使长时间运行的线程与关机配合使用的策略的信息。

你也可以使用deferToThread这一点。 如果您希望作业在该过程的整个生命周期中都可以运行,那么您可能只想直接使用stdlib threading模块。 考虑到这样的工作正在耗尽线程池插槽之一。 如果您有足够的线程池,那么线程池将已满,其他工作将无法进行。

您可能还希望将doWork 线程中删除 看起来它并没有进行很多阻塞。 而是在反应堆线程中运行doWork ,并且仅使用deferToThread运行loop_forever迭代。 现在您不再需要在线程中长时间运行,并且您的一些问题可能会消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM