What does sys.exit really do with multiple threads?
我真的被python中的sys.exit()搞糊涂了。在python文档中,它说"退出python";这是否意味着当在python程序中调用
1 2 3 4 5 6 7 8 9 10 11 12 | 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文档所说的那样是预期的结果,但仍然在系统中运行,那么
(为线程对象解释python 2文档中的内容)
通常情况下,只有当只有守护进程时,python程序才会退出?线程(忽略自身)仍在运行。与程序中的初始控制线程相对应的"主线程"对象不是守护进程线程。使用
这意味着,默认情况下,如果主程序创建和启动的任何线程在主线程终止时(通过
可以通过显式设置来重写此默认行为??任何在启动之前创建了
1 2 3 4 5 | if __name__=="__main__": t = threading.Thread(target=threadrun) t.daemon = True # Explicitly set property. t.start() sys.exit() |
当调用
?守护进程线程是在后台运行的低优先级线程,不会阻止解释器退出。请参阅守护进程线程说明。
??在python 3.3中,添加了一个
1 2 | # Sets whether the thread is daemonic via"daemon" keyword argument. t = threading.Thread(target=threadrun, daemon=True) |
但是,通过显式的属性分配语句单独执行仍然有效,因此将是做这件事。
根据文件
Exit the interpreter by raising SystemExit(status).
如果
这很容易。
在您的情况下,程序的结尾是最后一个线程将终止的时间。Python中的一种Cuin()方法(如Java)将等待其他线程。你可以把
1 2 3 4 5 | def threadrun(): i=1000_000_000_000 while(i>0): i=i-1 time.sleep(1) |
看别人表演你的节目。
提前为我的英语道歉(:
请阅读这篇文章(:在您的案例中,有一个很好的解释如何使用线程。使用threading.thread.join()。
和
文档https://docs.python.org/2/library/threading.html(但请放心,这只是为了获得更多的知识。
并阅读这篇关于守护进程属性的文章(如果不想等待其他线程终止python线程守护程序属性