看板 Python 關於我們 聯絡資訊
按官方文件,如果要在不同的thread之間傳遞資料,queue是個好的選擇,因為它 的put()及get()方法可以確保thread-safe。 我想做一個Server,Server中有一個queue叫做tasks,Server主要的工作是持續從 tasks裡取出指示(用get()),然後依序進行處理。 同一時間內會有多個client把希望被處理的指示堆入tasks中(用put()),無法確認 有多少個client及何時會將指示堆入tasks。 最簡單的做法是直接在Server.py裡做出tasks的實體: import queue tasks = queue.Queue() ... def ServerRun(): while True: instruction = tasks.get() # do something... ... 然後在Client.py呼叫tasks的put()把處理的事情堆入: import server ... server.tasks.put("Do something") ... 可是這麼做有個缺點,client可以直接操作server.tasks.get()把別的thread堆入 的事情刪掉。 一種可能的做法是在Server.py中把tasks隱藏,然後另外做出PutInstruction(): import queue _tasks = queue.Queue() def PutInstruction(instructin): _tasks.put(instructin) 這麼一來除非另外動手腳(我知道很簡單),不然client端只能透過PutInstruction() 把想做的事情推入tasks,而不能惡搞其他thread堆入的資料。 可是這樣的做法變成可能同一時間多個thread同時在存取PutInstruction(),還能 維持thread-safe嗎?又或是有其他更好的方法可以處理這類問題嗎? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.212.238 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1496738381.A.A06.html
alemonmk: queue 內部已有處理機制,不用擔心 06/06 18:08
uranusjr: Python object 本身都是 reentrant-safe 的, 不需擔心 06/06 18:22
uranusjr: 不過你的狀況我覺得每個 client 開一個 queue 架構更好 06/06 18:23