簡體   English   中英

從一個循環開始 n 個線程

[英]Starting n number of threads from a loop

所以基本上,我有這個 function th() 計數到一定數量然后打印“完成”。 我想同時啟動 n 個這樣的線程,同時運行。 所以我寫道:

thread_num = 3 #here n is 3, but I'd normally want something way higher

thrds = []

i = 0
while i < thread_num:
    thr = Thread(target=th, args=())
    thrds.append(thr)
    i += 1
    print("thread", str(i), "added")

for t in thrds:
    t.start()
    t.join()

我希望所有線程同時打印“完成”,但它們之間有明顯的滯后。 他們似乎在同一時間打印“我開始的線程”,但打印“完成”卻有相當長的時間滯后。 為什么會這樣?

編輯:因為有人讓我也添加 th() function,這里是:

def th():
    v = 0
    num = 10**7

    while v < num:
        v += 1
    print("done")

發生這種情況是因為您在啟動下一個線程之前在每個線程上調用的 t.join() 方法。 t.join() 阻塞當前線程的執行,直到線程 t 完成執行。 因此,每個線程都在前一個線程完成后開始。

因為您按順序啟動和加入每個線程,所以一個線程將在下一個甚至開始之前運行完成。 你最好運行一個線程池,它是一個更全面的實現,可以處理多線程中的多個問題。

由於 memory 管理和 object 引用計數問題,python 一次只讓一個線程執行字節碼。 每個線程將定期釋放並重新獲取全局解釋器鎖 (GIL) 以讓其他線程運行。 在任何給定時間究竟運行哪個線程取決於操作系統,您可能會發現一個線程比另一個線程獲得更多的切片,從而導致交錯的結果。

為了讓它們同時打印“完成”,你可以使用一個控制結構,比如線程的屏障,等待所有的完成。 有了屏障,所有線程都必須先調用wait才能繼續。

thread_num = 3 #here n is 3, but I'd normally want something way higher
wait_done = threading.Barrier(thread_num)

def th(waiter):
    x = 1 # to what you want
    waiter.wait()
    print("done")

thrds = []

i = 0
while i < thread_num:
    thr = Thread(target=th, args=(wait_done,))
    thrds.append(thr)
    i += 1
    print("thread", str(i), "added")

for t in thrds:
    t.start()
for t in thrds:
    t.join()

您首先必須啟動所有線程,然后將所有線程加入單獨for循環; 否則,每個線程啟動但由於在啟動另一個線程之前join而運行到完成。

for t in thrds:  # start all the threads
    t.start()
for t in thrds:  # wait for all threads to finish
    t.join()

如果您只有一個簡單的計數線程,您可能需要添加一些短暫的睡眠才能真正看到線程 output 混合在一起,因為它們可能仍然運行得足夠快以在另一個線程啟動之前完成。

暫無
暫無

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

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