簡體   English   中英

Python線程run()阻塞

[英]Python thread run() blocking

當我創建以下代碼時,我試圖創建一個可能被異常終止的線程類(因為我試圖讓線程等待一個事件):

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()

但是,運行該程序只會打印出一條“正在運行”消息,直到另一條消息終止。 這是為什么?

問題在於您正在調用run方法。

這只是您實現的一個普通的舊方法,它可以執行您在其主體中所做的任何事情。 在這種情況下,主體是一個無限循環,因此調用run永遠都是循環。

啟動線程的方法是start方法。 此方法是Thread類的一部分,它的作用是:

啟動線程的活動。

每個線程對象最多只能調用一次。 它安排在單獨的控制線程中調用對象的run()方法。

因此,如果調用此方法,它將啟動一個新線程,使該新線程運行run()方法,然后立即返回,以便主線程可以繼續執行其他操作。 1這就是您想要的。


1.正如讓·弗朗索瓦·法布爾(Jean-FrançoisFabre)所指出的那樣,您仍然不會在這里得到任何真正的並行性。 繁忙的循環從來都不是多線程代碼中的好主意,如果您在CPython或PyPy中運行它,幾乎所有繁忙的循環都在保持GIL的同時執行Python字節碼,並且一次只能有一個線程保持GIL。 因此,從粗略的角度看,事情看起來是並發的,三個線程正在運行,所有線程都在進步。 但是,如果放大,則幾乎沒有重疊,兩個線程同時進行,通常甚至不足以彌補小的調度程序開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM