我正在编写多进程程序。有四个类别:主要,工人,请求和确认。 Main类是程序的入口点。它将创建名为Worker的子流程来完成一些工作。主要过程将请求放入JoinableQueue中,然后Worker从队列中获取请求。当Worker完成请求后,它将ACK放入队列。代码部分如下所示:
主要:
class Main():
def __init__(self):
self.cmd_queue = JoinableQueue()
self.worker = Worker(self.cmd_queue)
def call_worker(self, cmd_code):
if self.cmd_queue.empty() is True:
request = Request(cmd_code)
self.cmd_queue.put(request)
self.cmd_queue.join()
ack = self.cmd_queue.get()
self.cmd_queue.task_done()
if ack.value == 0:
return True
else:
return False
else:
# TODO: Error Handling.
pass
def run_worker(self):
self.worker.start()
工作人员:
class Worker(Process):
def __init__(self, cmd_queue):
super(Worker, self).__init__()
self.cmd_queue = cmd_queue
...
def run(self):
while True:
ack = Ack(0)
try:
request = self.cmd_queue.get()
if request.cmd_code == ReqCmd.enable_handler:
self.enable_handler()
elif request.cmd_code == ReqCmd.disable_handler:
self.disable_handler()
else:
pass
except Exception:
ack.value = -1
finally:
self.cmd_queue.task_done()
self.cmd_queue.put(ack)
self.cmd_queue.join()
它通常可以正常工作。但是Main进程卡在self.cmd_queue.join()上,Worker有时卡在self.cmd_queue.join()上。太奇怪了!有人有什么想法吗?谢谢
答案 0 :(得分:0)
在上述问题中,没有任何古怪:您不应该在典型的单个工作进程活动中调用队列的join
,因为
Queue.join()
阻塞,直到队列中的所有项都已获得并且 已处理。
在当前实现中的调用将使处理管道处于等待状态。
通常,在启动/启动所有线程/工作程序之后,在主(主管)线程中调用queue.join()
。
https://docs.python.org/3/library/queue.html#queue.Queue.join