1 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在您的示例中,3 個(gè)進(jìn)程不會同時(shí)運(yùn)行(在啟動下一個(gè)進(jìn)程之前啟動它們并加入它們),我將假設(shè)實(shí)際情況確實(shí)具有并發(fā)性。
但要小心:在實(shí)際情況下,空隊(duì)列并不意味著其他任務(wù)已完成。您將需要另一種同步機(jī)制。
我的建議是回退到函數(shù)內(nèi)的常規(guī)列表,并在元素到達(dá)時(shí)將元素從多處理隊(duì)列傳輸?shù)搅斜怼H缓螅梢园错樞驅(qū)α斜砗痛蛴≡剡M(jìn)行排序。您不會遇到并發(fā)問題,因?yàn)閮?nèi)部列表僅由運(yùn)行 的線程修改。state_machinestate_machine
def state_machine(q):
"""
Function that sorts the queue (w.r.t x-coord.) and prints it out
"""
print("Queue elements:")
internal_queue = []
# here, we assume that all tasks have finished working.
# if it is not the case, you should add a barrier to wait
while not q.empty():
internal_queue.append(q.get())
internal_queue.sort(key=lambda item: (item.x), reverse=True)
for elt in internal_queue:
print(elt.x)
print("Queue is now empty!")
程序打印:
Queue elements:
25.1
15.4
13.4
10.1
9.1
8.3
5.1
1.3
Queue is now empty!
[編輯]
在實(shí)際方案中,您不希望在開始打印之前等待使用者完成。但是,您必須在兩個(gè)問題之間找到折衷方案:
如果你在開始消費(fèi)元素之前等待太長時(shí)間,你基本上會回到等待生產(chǎn)者完成。
如果您使用隊(duì)列中的元素太快(即在它們到達(dá)后立即打印它們),則您的隊(duì)列在大部分時(shí)間里往往是空的,并且排序不再有太大意義。
那里沒有(恕我直言)最佳解決方案,這里有一個(gè)命題,其中內(nèi)部隊(duì)列定期更新,同時(shí)讓生產(chǎn)者有時(shí)間完成工作:
def state_machine(q):
"""
Function that sorts the queue (w.r.t x-coord.) and prints it out
"""
internal_queue = []
def update_internal_queue():
while not q.empty():
internal_queue.append(q.get())
internal_queue.sort(key=lambda item: (item.x), reverse=True)
# wait a bit for the beginning of the elements to arrive
time.sleep(5)
update_internal_queue()
print("Queue elements:")
while internal_queue:
time.sleep(1) # we can optionally wait a bit before each print
update_internal_queue() # see if other elements arrived in the meantime
print(internal_queue.pop(0).x)
print("Queue is now empty!")
添加回答
舉報(bào)