两个进程之间的JoinableQueue,两个进程有时永远阻塞

时间:2019-07-19 09:05:52

标签: python python-3.x

我正在编写多进程程序。有四个类别:主要工人请求确认。 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()上。太奇怪了!有人有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:0)

在上述问题中,没有任何古怪:您不应该在典型的单个工作进程活动中调用队列的join,因为 Queue.join()

  

阻塞,直到队列中的所有项都已获得并且   已处理。

在当前实现中的调用将使处理管道处于等待状态。

通常,在启动/启动所有线程/工作程序之后,在主(主管)线程中调用queue.join()

https://docs.python.org/3/library/queue.html#queue.Queue.join