Python线程run()阻塞

时间:2018-07-24 08:22:00

标签: python python-3.x multithreading python-multithreading

在创建以下代码时,我试图创建一个可能被异常终止的线程类(因为我试图让线程等待事件)。

import sys

class testThread(threading.Thread):
    def __init__(self):
        super(testThread,self).__init__()
        self.daemon = True

    def run(self):
        try:
            print('Running')
            while 1:
                pass
        except:
            print('Being forced to exit')

test1 = testThread()
test2 = testThread()

print(test1.daemon)
test1.run()
test2.run()

sys.exit()

但是,运行该程序只会打印出一条“正在运行”消息,直到另一条消息终止。为什么会这样?

1 个答案:

答案 0 :(得分:4)

问题在于您正在调用run方法。

这只是您实现的一个普通的旧方法,它可以执行您放在其主体中的任何内容。在这种情况下,主体是一个无限循环,因此调用run只会永远循环。

启动线程的方法是start方法。此方法是Thread类的一部分,它的作用是:

  

开始线程的活动。

     

每个线程对象最多只能调用一次。它安排在单独的控制线程中调用对象的run()方法。

因此,如果调用此方法,它将启动一个新线程,使该新线程运行您的run()方法,然后立即返回,以便主线程可以继续执行其他操作。 1 这就是您想要的。


1。正如Jean-FrançoisFabre指出的那样,您仍然不会在这里获得任何真正的并行性。繁忙的循环从来都不是多线程代码中的好主意,如果您在CPython或PyPy中运行它,几乎所有繁忙的循环都在保持GIL的同时执行Python字节码,并且一次只能有一个线程保持GIL。因此,从粗略的角度看,事情看起来是并发的,三个线程正在运行,所有线程都在进步。但是,如果放大,则几乎没有重叠,两个线程同时进行,通常甚至不足以弥补小的调度程序开销。