关于python:sys.exit对多线程有什么作用?

What does sys.exit really do with multiple threads?

我真的被python中的sys.exit()搞糊涂了。在python文档中,它说"退出python";这是否意味着当在python程序中调用sys.exit()时,进程将退出?如果是这样,下面的代码将显示不同的结果:

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文档所说的那样是预期的结果,但仍然在系统中运行,那么sys.exit()真正做的是什么?


(为线程对象解释python 2文档中的内容)

通常情况下,只有当只有守护进程时,python程序才会退出?线程(忽略自身)仍在运行。与程序中的初始控制线程相对应的"主线程"对象不是守护进程线程。使用threading.Thread创建的线程从创建线程继承其后台状态,因此如果这是主线程,它们也将是非后台线程。

这意味着,默认情况下,如果主程序创建和启动的任何线程在主线程终止时(通过sys.exit()或仅仅通过点击其代码的末尾)仍在运行,则会阻止它退出。换句话说,只有当没有活动的非守护进程线程(换句话说,只有守护进程线程)时,程序才会退出。

可以通过显式设置来重写此默认行为??任何在启动之前创建了True的线程对象。

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

当调用sys.exit()时,它将允许程序实际结束(尽管像这样显式地调用它是不必要的,因为它在脚本的末尾)。

?守护进程线程是在后台运行的低优先级线程,不会阻止解释器退出。请参阅守护进程线程说明。

??在python 3.3中,添加了一个daemon关键字参数。至Thread。类构造函数,这意味着,从该版本开始,您可以简单地使用:

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

但是,通过显式的属性分配语句单独执行仍然有效,因此将是做这件事。


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

Exit the interpreter by raising SystemExit(status).

如果SystemExit到达默认的异常处理程序,它调用handle_system_exit(),或多或少地将其推送到Py_Finalize(),后者在python 2中调用wait_for_thread_shutdown(),因此sys.exit()与等待所有非守护进程线程终止时从主模块底部正常掉落的情况相同。


这很容易。

在您的情况下,程序的结尾是最后一个线程将终止的时间。Python中的一种Cuin()方法(如Java)将等待其他线程。你可以把while(true)改成时间意义上的有限方法。

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线程守护程序属性