2016-11-22 37 views
0

這裏是我跑測試線順序爲Python的Python線程序列

import threading 
import time 
import logging 
import random 

logging.basicConfig(level=logging.DEBUG, 
     format = '%(asctime)s (%(threadName)-10s) %(message)s') 

def worker(): 
     t = threading.currentThread() 
     pause = random.randint(1,10) 
     logging.debug('sleeping %s', pause) 
     time.sleep(pause) 
     logging.debug('ending sleep') 
     return 

for i in range(3): 
     t = threading.Thread(target=worker,name='t%s'%i) 
     t.setDaemon(True) 
     t.start() 

main_thread = threading.currentThread() 
for t in threading.enumerate(): 
     if t is main_thread: 
       continue 
     logging.debug('joining %s', t.getName()) 
     t.join() 

這裏是程序運行的輸出的一個示例程序:

2016-11-22 12:59:12,052 (t0  ) sleeping 3 
2016-11-22 12:59:12,052 (t1  ) sleeping 3 
2016-11-22 12:59:12,052 (t2  ) sleeping 8 
2016-11-22 12:59:12,052 (MainThread) joining t0 
2016-11-22 12:59:15,055 (t0  ) ending sleep 
2016-11-22 12:59:15,056 (MainThread) joining t2 
2016-11-22 12:59:15,056 (t1  ) ending sleep 
2016-11-22 12:59:20,054 (t2  ) ending sleep 
2016-11-22 12:59:20,054 (MainThread) joining t1 

通知加盟順序並不一致與枚舉列表順序,或與時間順序。主線程的連接順序應該調用t0 - > t1 - > t2線程序列,但是它應該調用 - > t2 - > t1。

這裏發生了什麼?

+0

爲什麼你會認爲threading.enumerate()將在您創建它們的相同順序返回? – bravosierra99

+0

學習多線程的第1步:你的線程將按照他們喜歡的順序進行,並且你無能爲力。 (好吧,你可以,但是如果你真的失去了你希望通過多線程獲得的所有收益。) – Delioth

回答

0

threading.enumerate()沒有說明它枚舉線程的順序。查看源代碼,線程在兩個dict_active_limbo之間進行跟蹤。當你枚舉時,你枚舉這些字典的鍵並且它們的順序沒有被定義。

以這種方式加入線程是有風險的。你佔了主線程,但是如果你導入一個使用後臺線程的模塊來達到自己的目的呢?相反,保持自己的列表

import threading 
import time 
import logging 
import random 

logging.basicConfig(level=logging.DEBUG, 
     format = '%(asctime)s (%(threadName)-10s) %(message)s') 

def worker(): 
     t = threading.currentThread() 
     pause = random.randint(1,10) 
     logging.debug('sleeping %s', pause) 
     time.sleep(pause) 
     logging.debug('ending sleep') 
     return 

threads = [] 

for i in range(3): 
     t = threading.Thread(target=worker,name='t%s'%i) 
     t.setDaemon(True) 
     t.start() 
     threads.append(t) 

for t in threads: 
     logging.debug('joining %s', t.getName()) 
     t.join() 

輸出是

2016-11-22 15:16:51,230 (t0  ) sleeping 10 
2016-11-22 15:16:51,232 (t1  ) sleeping 8 
2016-11-22 15:16:51,233 (t2  ) sleeping 4 
2016-11-22 15:16:51,234 (MainThread) joining t0 
2016-11-22 15:16:55,235 (t2  ) ending sleep 
2016-11-22 15:16:59,241 (t1  ) ending sleep 
2016-11-22 15:17:01,234 (t0  ) ending sleep 
2016-11-22 15:17:01,235 (MainThread) joining t1 
2016-11-22 15:17:01,235 (MainThread) joining t2