【问题标题】:Threading in Python - Threads or processes?Python中的线程-线程还是进程?
【发布时间】:2013-03-25 23:10:01
【问题描述】:

python 中的线程是如何实现的? python是否为每个线程创建一个单独的进程?

考虑一下这段代码。

from threading import Thread
from time import sleep


class testThread(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        while True:
            print "Thread inner!"
            sleep(5)
threadTest = testThread()
threadTest.start()       
while True:
    print "Thread outer!"
    sleep(10)

在 shell 上运行此代码然后执行 Ctrl+C 时,“线程外部”打印停止,但是“线程内部”继续打印,直到我使用“kill -9 pid”命令手动终止它。

【问题讨论】:

  • 设置线程为daemon

标签: python multithreading process


【解决方案1】:

在 Linux 上,每个线程都是一个线程,而不是一个单独的进程。使用ps 查看脚本运行时启动了哪些进程,您将看到一个 python 进程。

threading module 的文档说明:

可以将线程标记为“守护线程”。这件事的意义 flag 是当只有守护线程时整个 Python 程序退出 留下了。初始值继承自创建线程。这 flag 可以通过 daemon 属性设置。

...

有一个“主线程”对象;这对应于初始 Python 程序中的控制线程。它不是守护线程。

字里行间,整个Python程序只有在所有非守护线程(包括主线程)都退出时才会退出。

【讨论】:

    【解决方案2】:

    线程不是独立的进程。它们与主线程共享相同的资源。发生的事情是 Python 在退出之前等待所有线程完成运行。

    如果你想让 Python 在主进程退出后退出,daemonize 所有其他线程。你可以这样做:

    ...
    threadTest.daemon = True
    threadTest.start()
    ...
    

    这适用于非常基本的线程。但是,根据文档(上面链接):

    守护线程在关闭时突然停止。它们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果您希望线程优雅地停止,请将它们设为非守护进程并使用合适的信号机制,例如事件。

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多