我正在使用新的^{
查看下面的Python2/3脚本,它再现了我看到的行为:
#!/usr/bin/env python
from __future__ import print_function
import concurrent.futures
import time
def control_c_this():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future1 = executor.submit(wait_a_bit, name="Jack")
future2 = executor.submit(wait_a_bit, name="Jill")
for future in concurrent.futures.as_completed([future1, future2]):
future.result()
print("All done!")
def wait_a_bit(name):
print("{n} is waiting...".format(n=name))
time.sleep(100)
if __name__ == "__main__":
control_c_this()
当这个脚本运行时,使用常规的Control-C键盘中断似乎不可能完全终止。我在OSX上运行
kill
来终止脚本。Control-C被忽略了。我在网上找到的大多数文档都讨论了如何使用旧的threading
模块干净地杀死线程。这些似乎都不适用于这里。
而在concurrent.futures
模块中提供的用于停止数据的所有方法(比如Executor.shutdown()
和Future.cancel()
)只在未来尚未开始或完成时才起作用,这在本例中是没有意义的。我想马上打断你的未来。
我的用例很简单:当用户点击Control-C时,脚本应该像任何行为良好的脚本一样立即退出。这就是我想要的。
那么在使用concurrent.futures
时,获得这种行为的正确方法是什么?
有点痛。实际上,在主线程退出之前,必须完成工作线程。你不能离开除非他们离开。典型的解决方法是有一些全局状态,每个线程都可以检查以确定是否应该做更多的工作。
这是解释原因的quote。实际上,如果线程在解释器退出时退出,则可能会发生不好的事情。
这是一个有效的例子。注意,C-C最多需要1秒来传播,因为子线程的睡眠持续时间。
相关问题 更多 >
编程相关推荐