如何立即停止正在运行单元测试的 python 子进程?终止并杀死不起作用
-
26-09-2020 - |
题
我有一个 Tkinter GUI 运行两个线程,GUI 的主要线程和工作线程。工作线程使用以下代码创建子进程:
myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
文件 runTests.py 进行一些设置,然后使用以下命令运行单元测试文件:
execfile('myUnitTests.py')
文件 myUnitTests.py 有几个单元测试,其中一些需要五分钟以上的时间才能运行。在 GUI 中,我单击一个按钮来停止运行测试。这反过来又使工作线程发送信号来停止子进程:
myProcess.terminate()
终止命令不会立即停止进程,而是等到当前单元测试运行完毕后才终止进程?我尝试过使用 os.kill
但我得到的结果与 terminate()
.
知道如何使我的程序更具响应性,以便它立即终止子进程吗?
解决方案
Python 文档 [ http://docs.python.org/library/signal.html ] 说:
- 尽管就 Python 用户而言,Python 信号处理程序是异步调用的,但它们只能发生在 Python 解释器的“原子”指令之间。这意味着在纯粹用 C 实现的长计算期间到达的信号(例如对大量文本进行正则表达式匹配)可能会延迟任意时间。
因此,如果您的五分钟单元测试正在进行“纯粹用 C 实现的长计算”, 和 您的单元测试工具安装了一个处理程序 SIGTERM
, , 那是你的问题。如果是这样,请尝试 myProcess.kill
代替 myProcess.terminate
(或者,如果你还没有 2.6, myProcess.send_signal(9)
). SIGKILL
无法从用户空间捕获并且应该立即生效。
警告:任何应该在单元测试框架之外运行的清理操作都不会被执行。
不隶属于 StackOverflow