[問題] thread與queue的問題

作者: icetofux   2017-06-06 16:39:38
按官方文件,如果要在不同的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嗎?又或是有其他更好的方法可以處理這類問題嗎?
謝謝。
作者: alemonmk (單色檸檬子)   2017-06-06 18:08:00
queue 內部已有處理機制,不用擔心
作者: uranusjr (←這人是超級笨蛋)   2017-06-06 18:22:00
Python object 本身都是 reentrant-safe 的, 不需擔心不過你的狀況我覺得每個 client 開一個 queue 架構更好

Links booklink

Contact Us: admin [ a t ] ucptt.com