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

标签 python python-3.x

我正在编写多进程程序。有四个类:MainWorkerRequestAck。 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/

相关文章:

python - 如何将参数从 mock.patch 传递给 new_callable?

python - Flask框架中thread local是什么意思?

python - 带有 TensorFlow 的 CNN 架构

python - GraphLab Create 安装错误 - Python 3.5.2

python - 关闭 __class__

python - 在 Pandas 图中仅隐藏轴标签,而不是整个轴

执行 HTTP 调用时打印一个点到控制台的 Python 函数

python - 奇怪的输出 sys.getsizeof()

javascript - Django 模板变量和 Javascript

python - 如何在 Python 中查看函数签名?