按官方文件,如果要在不同的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嗎?又或是有其他更好的方法可以處理這類問題嗎?
謝謝。