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。
這裏發生了什麼?
爲什麼你會認爲threading.enumerate()將在您創建它們的相同順序返回? – bravosierra99
學習多線程的第1步:你的線程將按照他們喜歡的順序進行,並且你無能爲力。 (好吧,你可以,但是如果你真的失去了你希望通過多線程獲得的所有收益。) – Delioth