0

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”命令手动终止它。

4

2 回答 2

1

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

线程模块注释的文档:

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。初始值继承自创建线程。可以通过 daemon 属性设置标志。

...

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

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

于 2013-03-25T23:29:11.400 回答
1

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

如果您希望 Python 在主进程退出后退出,请守护所有其他线程。您可以按如下方式执行此操作:

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

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

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

于 2013-03-25T23:35:36.067 回答