当前位置: 首页 > 知识库问答 >
问题:

什么是系统。退出真的需要多线程吗?

董琦
2023-03-14

我真的被系统搞糊涂了。python中的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()

linux中启动这个程序,结果并不像python文档所说的那样是预期的,但仍然在系统中运行,所以sys的作用是什么呢。退出()真的要退出吗?

共有3个答案

帅令雪
2023-03-14

在您的情况下,程序的结束时间是最后一个线程终止的时间。也许python中的某种join()方法(如Java)会等待其他线程。

请阅读这篇文章(:这里有一个很好的解释,说明如何在使用threading.Thread.join()的情况下使用线程)

文档https://docs.python.org/2/library/threading.html (但请放松,这只是为了获得更多的知识。

并阅读这篇关于守护进程属性的文章(若您不想等待其他线程终止),这意味着Python线程上的守护进程属性

汪驰
2023-03-14

(解释Python 2文档中关于线程对象的内容)

通常,Python程序只有在除了守护进程线程(忽略自身)之外没有其他内容时才会退出。与程序中控制的初始线程相对应的“主线程”对象不是守护线程。使用线程创建的线程。线程从创建线程继承它们的守护状态,所以如果这是主线程,它们也将是非守护状态。

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

您可以通过显式设置✶✶在启动之前,将任何已创建线程对象的守护进程属性设置为True

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

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

✶✶在Python 3.3中,在线程类构造函数中添加了一个默认值为None守护进程关键字参数,这意味着从该版本开始,您可以简单地使用:

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

但是,通过显式属性赋值语句单独执行仍然有效,因此这是一种更具版本可移植性的方法。

郎成弘
2023-03-14

根据文件sys。exit()引发SystemExit

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

如果SystemExit到达默认的异常处理程序,它将调用handle\u system\u exit(),这或多或少会推送到Py\u Finalize(),而Python 2中的wait\u for\u thread\u shutdown(),因此sys。exit()与在等待所有非守护进程线程终止时从主模块底部掉落的正常情况相同。

 类似资料:
  • 问题内容: class mythread implements Runnable { 输出为: 但是我想要的输出就像首先应该在线程“ rohan”中打印5,然后在“ jain”中打印5,然后在线程“ main”中打印5,依此类推…请帮助.. !!!!!! 问题答案: 这些问题确实使我感到困惑。线程的全部要点是它们并行 异步 运行,因此我们可以获得更好的性能。由于硬件,竞争条件,时间分段随机性和其他

  • 问题内容: Docker对Union File系统(例如AUFS)创建容器究竟做了什么?如果Docker必须使用常规文件系统而不是联合文件系统,那么会有什么缺点? 我正在寻找具体的技术细节/内部信息,而不是高水平的答案。 问题答案: 它用于: 避免在每次将图像作为新容器运行时复制一组完整的文件 在其自己的层中隔离对容器文件系统的更改,从而允许从已知内容重新启动同一容器(因为移除容器后,具有更改的层

  • 问题内容: 特别是在Python中,如何在线程之间共享变量? 尽管我以前从未使用过,但从未真正理解或看到过如何共享变量的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我何时需要使用线程本地存储来避免这种共享? 我已经看到许多有关通过使用锁在线程之间同步对共享数据的访问的警告,但是我还没有看到这个问题的一个很好的例子。 提前致谢! 问题答案: 在Python中,所有内容都是共享的,但函

  • 主要内容:1 什么是Java多线程,2 Java多线程的优点,3 进程与线程区别,4 Java Thread类,5 Java Thread类的方法1 什么是Java多线程 Java 多线程指的是同时执行多个线程的处理。 线程是轻量级子进程,是最小的处理单元。多处理和多线程都用于实现多任务。 但是,我们使用多线程而不是多进程,因为线程使用共享内存区域。它们不分配单独的内存区域,因此节省了内存,并且线程之间的上下文切换比进程花费的时间更少。 线程是轻量级子进程,是最小的处理单元。这是一条单独的执行路

  • 本文向大家介绍为什么要使用多线程?相关面试题,主要包含被问及为什么要使用多线程?时的应答技巧和注意事项,需要的朋友参考一下 先从总体上来说: 从计算机底层来说:线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。 从当代互联网发展趋势来说:现在的系统动不动就要求百万级甚至千万级的并

  • 问题内容: 阅读有关断言的一些文档时,我发现: “通常启用断言,但禁用系统类中的断言。” 哪些系统类? 问题答案: 根据声明文档,系统类是“没有显式类加载器”的类,即由引导类加载器加载的类。AFAIK表示整个标准API 的内容。