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

停止Python脚本的最佳方法,即使脚本中有线程在运行,python,multithreading,Python,Multithreading,我有一个python程序run_tests.py,它一个接一个地执行测试脚本(也是用python编写的)。每个测试脚本都可以使用线程 问题是,当测试脚本意外崩溃时,它可能没有机会整理所有打开的线程(如果有的话),因此测试脚本实际上无法完成,因为线程保持打开状态。出现这种情况时,run_tests.py会被卡住,因为它正在等待测试脚本完成,但它从来没有这样做过 当然,我们可以尽最大努力捕获所有异常,并确保每个测试脚本中的所有线程都被整理好,这样就不会出现这种情况,我们还可以将所有线程设置为守护进程

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

问题是,当测试脚本意外崩溃时,它可能没有机会整理所有打开的线程(如果有的话),因此测试脚本实际上无法完成,因为线程保持打开状态。出现这种情况时,
run_tests.py
会被卡住,因为它正在等待测试脚本完成,但它从来没有这样做过

当然,我们可以尽最大努力捕获所有异常,并确保每个测试脚本中的所有线程都被整理好,这样就不会出现这种情况,我们还可以将所有线程设置为守护进程线程,等等,但我要寻找的是“捕获所有线程”
run_tests.py
级别的机制,确保我们不会因为测试脚本中未完成的线程而无限期地陷入困境。我们可以实现在每个测试脚本中如何使用线程的指导原则,但归根结底,我们无法完全控制每个测试脚本的编写方式

简而言之,我需要做的是停止
run_tests.py
中的测试脚本,即使测试脚本中有恶意线程打开。一种方法是执行shell命令killall-9或类似的命令,但这似乎过于强制/突然

有更好的办法吗


感谢阅读。

对我来说,这看起来像是
子流程
模块的原始应用程序。 也就是说,不要从同一个python解释器中运行测试脚本,而是为每个测试脚本生成一个新的进程。您有什么特别的原因不想生成一个新进程并在同一个解释器中运行它们吗?有一个子进程将脚本彼此隔离,如导入和其他全局变量


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

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


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

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


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

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


如果您使用
subprocess.Popen
启动子进程,那么您有一个
.terminate()
方法在需要时终止进程。

我实际需要做的是在每个测试脚本结束时整理所有线程,而不是在
run\u tests.py
级别。我不能控制每个测试脚本的主要功能,但我可以控制整理功能

这是我的最终解决方案:

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

我实际上不需要停止线程。我只需要用
\u Thread\u stop()
将它们标记为stopped,这样测试脚本就可以退出了。我希望其他人会觉得这很有用。

我实际上需要做的是在每个测试脚本结束时整理所有线程,而不是在
run\u tests.py
级别。我不能控制每个测试脚本的主要功能,但我可以控制整理功能

这是我的最终解决方案:

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

我实际上不需要停止线程。我只需要用
\u Thread\u stop()
将它们标记为stopped,这样测试脚本就可以退出了。我希望其他人会觉得这很有用。

我实际上需要做的是在每个测试脚本结束时整理所有线程,而不是在
run\u tests.py
级别。我不能控制每个测试脚本的主要功能,但我可以控制整理功能

这是我的最终解决方案:

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

我实际上不需要停止线程。我只需要用
\u Thread\u stop()
将它们标记为stopped,这样测试脚本就可以退出了。我希望其他人会觉得这很有用。

我实际上需要做的是在每个测试脚本结束时整理所有线程,而不是在
run\u tests.py
级别。我不能控制每个测试脚本的主要功能,但我可以控制整理功能

这是我的最终解决方案:

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

我实际上不需要停止线程。我只需要用
\u Thread\u stop()
将它们标记为stopped,这样测试脚本就可以退出了。我希望其他人会觉得这很有用。

阅读此答案让我意识到我实际上问错了问题。现在我已经找到了要问的正确问题,我有了