[问题] 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