我对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()
真正做了什么?
答案 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