在python子线程中调用sys.exit函数,是什么效果?先说结论:如果没有捕获SystemExit异常,子线程退出,主线程还在继续该干嘛干嘛;如果在线程中有代码捕获了SystemExit异常,子线程都可以不退出。(在python脚本中使用sys.exit函数)

我们一般在python交互式的解释器中使用exit会quit退出,而在python脚本中使用sys.exit函数退出程序。现在的问题是在python的子线程中使用sys.exit函数,答案是,可以退出子线程,但不影响主线程的运行。

下面这个测试程序,有兴趣的同学可以自己试试看:

import os
import sys
import time
import threading
gNum = 0
def test():
global gNum
while True:
print('i am in test')
gNum += 1
if gNum == 10: sys.exit(123)
time.sleep(1)
tt = threading.Thread(target=test)
tt.start()
tt.join()
for i in range(10):
print('main thread end')
time.sleep(1)

子线程test会打印10遍,然后退出,接着主线程在打印它的内容10遍。你如果把sys.exit换成os._exit,主线程的10遍打印,就看不到了。

所以,如果要在子线程中直接中断整个程序的运行,只有os._exit可以选(exit和quit也不行,他们跟sys.exit一样,只是常常在交互式场景下使用),但这是个不好的设计!使用os._exit直接退出python解释器,什么清理工作都不做。应该在主线程中通过sys.exit函数来结束程序,在主线程中判断各子线程的执行状态和结果。

-- EOF --