wdy*_*wdy 11 python multithreading exit
我对python中的sys.exit()感到很困惑.在python文档中,它说"退出Python"; 这是否意味着sys.exit()在python程序中调用时,进程将退出?如果是这样,下面的代码显示了不同的结果:
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()
Run Code Online (Sandbox Code Playgroud)
在Linux中启动这个程序,结果不是python文档说的那个预期的,但仍然在系统中运行,那么sys.exit()真正做到了什么?
根据文件sys.exit()提出SystemExit:
通过提升SystemExit(状态)退出解释器.
如果SystemExit到达默认的异常处理程序,它会调用handle_system_exit(),或多或少地推送到Py_Finalize(),而后者又调用wait_for_thread_shutdown()Python 2,因此sys.exit()与等待所有非守护程序线程的主模块底部的正常情况相同终止.
(解释线程对象的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()
Run Code Online (Sandbox Code Playgroud)
这将允许程序在sys.exit()被调用时实际结束(虽然这样做是明确地调用它,因为它无论如何都在脚本的末尾).
✶守护程序线程是在后台运行的低优先级线程,不会阻止解释器退出.请参阅守护程序线程说明.
✶✶在Python 3.3中,daemon关键字参数被添加到None
类构造函数中,这意味着,从该版本开始,您可以简单地使用:
# Sets whether the thread is daemonic via "daemon" keyword argument.
t = threading.Thread(target=threadrun, daemon=True)
Run Code Online (Sandbox Code Playgroud)
但是,通过显式属性赋值语句单独执行它仍然有效,因此将是更加版本可移植的方式.
| 归档时间: |
|
| 查看次数: |
1660 次 |
| 最近记录: |