如何停止正在运行单元测试的python子进程?终止并杀死不工作的人
我有一个Tkinter GUI运行两个线程,GUI的主线程和工作线程。工作线程使用以下代码创建子进程:如何停止正在运行单元测试的python子进程?终止并杀死不工作的人,python,subprocess,terminate,execfile,Python,Subprocess,Terminate,Execfile,我有一个Tkinter GUI运行两个线程,GUI的主线程和工作线程。工作线程使用以下代码创建子进程: myProcess = subprocess.Popen(['python', '-u', 'runTests.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 文件runTests.py执行一些设置,然后使用以下命令运行单元
myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
文件runTests.py执行一些设置,然后使用以下命令运行单元测试文件:
execfile('myUnitTests.py')
文件myUnitTests.py有几个单元测试,其中一些测试运行时间超过五分钟。
在GUI中,我单击一个按钮停止运行测试。这反过来会使工作线程发送停止子进程的信号:
myProcess.terminate()
terminate命令不会立即停止进程,它会等待当前单元测试完成运行,然后终止进程?
我曾尝试使用os.kill
,但得到的结果与terminate()
相同
您知道如何使程序更具响应性,从而立即终止子进程吗?Python文档[]说:
- 尽管就Python用户而言,Python信号处理程序是异步调用的,但它们只能在Python解释器的“原子”指令之间发生。这意味着,在纯用C实现的长时间计算过程中到达的信号(例如大型文本体上的正则表达式匹配)可能会延迟任意时间
SIGTERM
安装了一个处理程序,那么这就是您的问题所在。如果是,请尝试myProcess.kill
而不是myProcess.terminate
(或者,如果没有2.6,myProcess.send\u信号(9)
)SIGKILL
无法从用户空间进行修补,应立即生效
警告:任何应该在单元测试框架之外运行的清理操作都不会执行