我在这里尝试做的是使用键盘中断来退出程序中所有正在进行的线程。这是我的代码的精简版本,其中创建了线程:
for i in taskDictionary:
try:
sleep(60)
thread = Thread(target = mainModule.executeThread)
thread.start()
except KeyboardInterrupt:
thread.__stop()
程序本身要复杂得多,考虑到影响线程的大量不同变量,甚至可以选择以顺序模式启动,其中任务不是线程化的,而是逐一启动,因此可能会出现一些问题我只是想出了这个小小的变化。
我的做法取得了 50/50 的结果。中断可以工作,但线程永远不会干净地退出。有时它们会继续运行,但会停止未来线程的执行,有时它们会因中断而出现严重错误而退出,有时中断根本不会执行任何操作。上次我运行此程序时,程序停止了任何未来线程的执行,但没有停止当前线程。
有没有办法退出线程而不进入线程实际执行的模块?
类似的问题是“如何杀死一个线程?”
您在线程中创建一个退出处理程序,该处理程序由线程模块中的锁或事件对象控制。然后,您只需删除锁或向事件对象发出信号即可。这通知线程它应该停止处理并正常退出。在主程序中向线程发出信号后,唯一要做的就是使用thread.join()
中的方法main
这将等待线程关闭。
一个简短的例子:
import threading
import time
def timed_output(name, delay, run_event):
while run_event.is_set():
time.sleep(delay)
print name,": New Message!"
def main():
run_event = threading.Event()
run_event.set()
d1 = 1
t1 = threading.Thread(target = timed_output, args = ("bob",d1,run_event))
d2 = 2
t2 = threading.Thread(target = timed_output, args = ("paul",d2,run_event))
t1.start()
time.sleep(.5)
t2.start()
try:
while 1:
time.sleep(.1)
except KeyboardInterrupt:
print "attempting to close threads. Max wait =",max(d1,d2)
run_event.clear()
t1.join()
t2.join()
print "threads successfully closed"
if __name__ == '__main__':
main()
如果您确实需要以下功能killing线程,使用多处理。它允许您将 SIGTERM 发送到各个“进程”(它也与线程模块非常相似)。一般来说,线程适用于 IO 受限的情况,而多处理适用于真正处理器受限的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)