如何修改此代码(使用扭曲),以便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
上没有答案 0 :(得分:0)
Twisted使用Python的线程库来实现deferToThread
。适用于Python线程的所有规则都适用于deferToThread
获得的线程。一条规则是信号和线程组合不好(Ctrl-C在Linux上发送SIGINT)。
解决这个问题的基本思路是将一些逻辑放入doWork
以便它将停止。也许这意味着设置一个全局标志,每次迭代检查一次。你可以在其他地方找到很多关于使长期运行的线程与shutdown配合的策略的信息。
您可能还希望不使用deferToThread
。如果您希望您的作业在该过程的大部分生命周期内运行,那么您可能只想直接使用stdlib threading
模块。考虑这样的工作正在耗尽其中一个线程池插槽。如果你有足够的这些,那么你的线程池将会满了,其他工作将无法继续。
您可能还想将该帖子的doWork
带走。看起来它看起来不是很多阻塞。相反,在reactor线程中运行doWork
并仅使用loop_forever
运行deferToThread
的迭代。现在,您不再需要在一个线程中进行长时间运行,并且您的一些问题可能会消失。