【问题标题】:How to stop a python subprocess which is running unit tests right away? Terminate and kill not working如何立即停止正在运行单元测试的 python 子进程?终止并杀死不工作
【发布时间】:2011-03-19 04:34:09
【问题描述】:

我有一个运行两个线程的 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()

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

知道如何让我的程序响应更快,以便立即终止子进程吗?

【问题讨论】:

    标签: python subprocess terminate execfile


    【解决方案1】:

    Python 文档 [http://docs.python.org/library/signal.html] 说:

    • 尽管就 Python 用户而言,Python 信号处理程序是异步调用的,但它们只能出现在 Python 解释器的“原子”指令之间。这意味着,在纯粹用 C 语言实现的长时间计算期间到达的信号(例如对大量文本的正则表达式匹配)可能会延迟任意时间。

    因此,如果您的 5 分钟单元测试正在执行“纯粹在 C 中实现的长时间计算”,并且您的单元测试工具会为 SIGTERM 安装一个处理程序,那就是您的问题。如果是这样,试试myProcess.kill 而不是myProcess.terminate(或者,如果你没有2.6,myProcess.send_signal(9))。 SIGKILL 无法从用户空间捕获,应立即生效。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多