假設我有一個線程池。這個線程池使用兩個隊列q1
和q2
。它從q1
讀取並在q2
上寫入新項目。當q1
爲空時,我們交換兩個隊列q1, q2, = q2, q1
,我們重複該過程,直到兩者都爲空。爲了同步線程,我使用另一個只包含一個項目的隊列,並在流程結束時刪除此項目。使用兩個隊列同步線程
我認爲這是一個非常愚蠢的做法。任何改進建議?
一個非常漂亮的簡單例子是docs,但只有一個隊列。我的解決方案看起來並不很漂亮,如果是正確的:
global flag
global lock
global barrier
global q1
global q2
global q
while True:
if q1.empty():
flag = False
barrier.wait() # wait for all the theads to reach this point.
# execute the code of swapping queues only once
with lock:
if not flag:
flag = True
if q2.empty():
q.get()
q.task_done()
else:
q1, q2 = q2, q1
process_items_in_q1()
您正在使用2個輸入隊列的原因嗎?如果你有一個工作者線程池,爲什麼沒有一個輸入隊列讓工作者從中獲得工作?先進先出?雙輸入隊列是否是一項要求? – user1836293
我正在實施BFS +我們發現的每個節點的一些東西。每個階段的seaching可以並行化,但是當一個階段完成後,纔可以轉到下一個階段。當然,除非我錯過了一個更好的主意。 –