我正在编写多进程程序。有四个类:Main、Worker、Request 和 Ack。 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()
worker :
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()。太奇怪了!有人有什么想法吗?谢谢
最佳答案
上述问题没有什么奇怪:您不应该在典型的单个工作进程事件中调用队列的join
,因为
Queue.join()
Blocks until all items in the queue have been gotten and processed.
当前实现中的此类调用将使处理管道等待。
通常在初始化/启动所有线程/工作线程后,在主(主管)线程中调用queue.join()。
https://docs.python.org/3/library/queue.html#queue.Queue.join
关于python - 两个进程之间的JoinableQueue,两个进程有时会永远阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57109079/