Python中的线程 - 线程或进程?

时间:2013-03-25 23:10:01

标签: python multithreading process

如何在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时,“Thread outer”打印停止,但“Thread inner”继续打印,直到我使用'kill -9 pid'命令手动终止它。

2 个答案:

答案 0 :(得分:1)

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

threading module注释的文档:

  

线程可以标记为“守护程序线程”。这个的意义   flag是只有守护进程线程时整个Python程序退出   离开了。初始值继承自创建线程。该   可以通过守护进程属性设置标志。

     

...

     

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

在行之间读取,整个Python程序仅在所有非守护程序线程(包括主线程)退出时退出。

答案 1 :(得分:1)

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

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

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

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

  

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