是否可以在不设置/检查任何标志/信号量/等的情况下终止正在运行的线程?
原文由 Sudden Def 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否可以在不设置/检查任何标志/信号量/等的情况下终止正在运行的线程?
原文由 Sudden Def 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个 multiprocessing.Process
可以 p.terminate()
在我想终止线程但又不想使用标志/锁/信号/信号量/事件/其他任何东西的情况下,我将线程提升为成熟的进程。对于只使用几个线程的代码来说,开销还算不错。
例如,这可以方便地终止执行阻塞 I/O 的辅助“线程”
The conversion is trivial: In related code replace all threading.Thread
with multiprocessing.Process
and all queue.Queue
with multiprocessing.Queue
and add the required calls of p.terminate()
给你想要杀死它的孩子的父进程 p
请参阅 multiprocessing
的 Python 文档。
例子:
import multiprocessing
proc = multiprocessing.Process(target=your_proc_function, args=())
proc.start()
# Terminate the process
proc.terminate() # sends a SIGTERM
原文由 cfi 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
2 回答862 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
在 Python 和任何语言中,突然终止线程通常是一种糟糕的模式。考虑以下情况:
处理这个问题的好方法,如果你负担得起(如果你管理自己的线程),是有一个 exit_request 标志,每个线程定期检查它是否到了退出的时间。
例如:
在此代码中,您应该在线程退出时调用
stop()
,并使用join()
等待线程正确退出。线程应该定期检查停止标志。然而,在某些情况下,您确实需要终止线程。一个例子是当你正在包装一个忙于长时间调用的外部库时,你想打断它。
以下代码允许(有一些限制)在 Python 线程中引发异常:
(基于 Tomer Filiba 的 Killable Threads 。关于
PyThreadState_SetAsyncExc
的返回值的引用似乎来自 旧版本的 Python 。)如文档中所述,这不是灵丹妙药,因为如果线程在 Python 解释器之外很忙,它就不会捕获中断。
此代码的一个很好的使用模式是让线程捕获特定异常并执行清理。这样,您可以中断任务并仍然进行适当的清理。