sys.exit对多线程有什么作用?

时间:2016-08-06 13:52:17

标签: python multithreading exit

我对python中的sys.exit()感到很困惑。 在python documentation中,它表示“退出Python”;这是否意味着在python程序中调用sys.exit()时,进程将退出?如果是这样,下面的代码显示了不同的结果:

import sys
import time
import threading

def threadrun():
    while(True):
        time.sleep(1)

if __name__=="__main__":
    t=threading.Thread(target=threadrun)
    t.start()
    sys.exit()

在linux中启动这个程序,结果不是python文档中所说的那个但是仍然在系统中运行,那么sys.exit()真正做了什么?

3 个答案:

答案 0 :(得分:5)

根据文档sys.exit()提出SystemExit

  

通过提升SystemExit(状态)退出解释器。

如果SystemExit到达default exception handler, 它调用handle_system_exit(),或多或少地推送到Py_Finalize(),后者又在Python 2中调用wait_for_thread_shutdown(),因此sys.exit()与正常的相同离开主模块的底部,等待所有非守护进程线程终止。

答案 1 :(得分:5)

(解释Thread Objects的Python 2文档中的内容)

通常只有当守护进程时才会退出Python程序  线程(忽略自己)离开了。对应于程序中的初始控制线程的“主线程”对象不是守护程序线程。使用threading.Thread创建的线程从创建线程继承其守护进程状态,因此如果这是主线程,它们也将是非守护进程。

这意味着默认情况下 主程序创建和启动的任何线程都会阻止它在主线程终止时仍然运行(通过sys.exit()或简单地通过只是命中它的代码结束)。换句话说,只有当没有活着的非守护进程线程(换句话说,只有守护进程)线程时,程序才会退出。

您可以通过显式设置✶✶来覆盖此默认行为 任何daemon财产 在启动之前创建了线程对象True

if __name__=="__main__":
    t = threading.Thread(target=threadrun)
    t.daemon = True  # Explicitly set property.
    t.start()
    sys.exit()

这将允许程序在调用sys.exit()时实际结束(虽然这样做是明确地调用它,因为它始终在脚本的末尾)。

守护程序线程是在后台运行的低优先级线程,不会阻止解释程序退出。见Daemon Threads Explanation

✶✶在Python 3.3中,添加了 daemon 关键字参数 到Thread class constructor, 这意味着,从该版本开始,您只需使用:

    # Sets whether the thread is daemonic via "daemon" keyword argument.
    t = threading.Thread(target=threadrun, daemon=True)

但是,通过显式属性赋值语句单独执行此操作 仍然有效,因此将是更加版本可移植的方式 这样做。

答案 2 :(得分:1)

很容易。

在您的情况下,程序结束时将终止最后一个线程。也许python中的一种join()方法(如在Java中)会等待其他线程。 你可以改变while(true)以获得时间上有限的方法。

def threadrun():
i=1000_000_000_000
    while(i>0):
        i=i-1
        time.sleep(1)

并观看另一个表现你的节目。

提前抱歉我的英语(:

并且请阅读这篇文章(:在你的案例中有一个很好的解释如何使用线程 Use of threading.Thread.join()

文档 https://docs.python.org/2/library/threading.html(但放松一下,只是为了增加知识。

并阅读本文关于守护进程属性(如果您不想等待其他线程终止 Python thread daemon property