在python子线程中调用sys.exit的效果?

2019年12月28日 / 13次阅读 / Last Modified 2020年1月16日
sys模块多线程

在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 --

本文链接:https://www.pynote.net/archives/1652

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top