[英]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.