即使脚本中有线程运行,最好的方法是停止Python脚本

时间:2015-03-01 22:02:18

标签: python multithreading

我有一个python程序run_tests.py,它逐个执行测试脚本(也用python编写)。每个测试脚本都可以使用线程。

问题是,当测试脚本意外崩溃时,它可能没有机会整理所有打开的线程(如果有的话),因此测试脚本实际上无法完成,因为线程处于悬空状态。发生这种情况时,run_tests.py会因为等待测试脚本完成而卡住,但它永远不会。

当然,我们可以尽力捕获所有异常并确保在每个测试脚本中整理所有线程,以便这种情况永远不会发生,我们也可以将所有线程设置为守护程序线程等,但是我我正在寻找的是一个" catch-all" run_tests.py级别的机制,确保我们不会因测试脚本中未完成的线程而无限期地卡住。我们可以实现如何在每个测试脚本中使用线程的指南,但最终,我们无法完全控制每个测试脚本的编写方式。

简而言之,我需要做的是在run_tests.py中停止测试脚本,即使在测试脚本中打开了流氓线程。一种方法是执行shell命令killall -9 <test_script_name>或类似的东西,但这似乎太强大/突然。

有更好的方法吗?

感谢阅读。

2 个答案:

答案 0 :(得分:2)

对我而言,这看起来像是subprocess模块的原始应用程序。 即不要在同一个python解释器中运行测试脚本,而是为每个测试脚本生成一个新进程。您是否有任何特殊原因要求您不想生成新进程并在同一个解释器中运行它们?让子进程将脚本彼此隔离,例如导入和其他全局变量。

如果您使用subprocess.Popen启动子流程,那么您可以使用.terminate()方法在需要时终止该流程。

答案 1 :(得分:1)

我实际需要做的是在每个测试脚本末尾而不是run_tests.py级别整理所有线程。我无法控制每个测试脚本的主要功能,但我确实可以控制整齐的功能。

所以这是我的最终解决方案:

for key, thread in threading._active.iteritems():
        if thread.name != 'MainThread':
                thread._Thread__stop()

我实际上并不需要停止线程。我只需要将它们标记为_Thread__stop()停止,以便测试脚本可以退出。我希望其他人觉得这很有用。