首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何立即停止正在运行单元测试的python子进程?终止和终止不起作用

如何立即停止正在运行单元测试的python子进程?终止和终止不起作用
EN

Stack Overflow用户
提问于 2010-07-22 03:15:01
回答 1查看 2.7K关注 0票数 1

我有一个运行两个线程的Tkinter GUI,GUI的主线程和一个工作线程。工作线程使用以下代码创建子进程:

代码语言:javascript
复制
myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],  
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)

文件runTests.py执行一些设置,然后使用以下命令运行单元测试文件:

代码语言:javascript
复制
execfile('myUnitTests.py')

文件myUnitTests.py有几个单元测试,有些单元测试需要5分钟以上的时间才能运行。在GUI中,我单击一个按钮以停止运行测试。这反过来会使工作线程发送一个信号来停止该子进程:

代码语言:javascript
复制
myProcess.terminate()

terminate命令不会立即停止进程,它会等待当前单元测试完成运行,然后终止进程?我尝试过使用os.kill,但我得到了与terminate()相同的结果。

你知道如何让我的程序更有响应性,这样它就会立即杀伤子进程吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-22 07:36:55

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是无法从用户空间捕获的,应该会立即生效。

警告:任何应该在退出单元测试框架时运行的清理操作都将不会执行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3302910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档