Python—多处理—进程变成了僵尸

Python—多处理—进程变成了僵尸,python,multiprocessing,Python,Multiprocessing,几周来,我一直在尝试用python(2.7.x)中的多处理模块解决一个问题 创意: 让我们拥有消息队列(在我们的例子中是RabbitMQ)。在该队列和将处理该消息的消息生成任务上创建侦听器 问题: 一切正常,但在执行了几百个任务后,一些子进程变成了僵尸,这是主要问题 我们还有一些限制(例如每台机器的最大任务数)——这最终导致机器停止处理任何任务 当前实施: 我创建了最少的代码来解释我们的方法 我非常愿意为此使用一些库—如果您可以推荐一些,那也会很好。使用SIGCHLD捕获子进程终止有很多问题。

几周来,我一直在尝试用python(2.7.x)中的多处理模块解决一个问题

创意:

让我们拥有消息队列(在我们的例子中是RabbitMQ)。在该队列和将处理该消息的消息生成任务上创建侦听器

问题:

一切正常,但在执行了几百个任务后,一些子进程变成了僵尸,这是主要问题

我们还有一些限制(例如每台机器的最大任务数)——这最终导致机器停止处理任何任务

当前实施:

我创建了最少的代码来解释我们的方法


我非常愿意为此使用一些库—如果您可以推荐一些,那也会很好。

使用SIGCHLD捕获子进程终止有很多问题。信号处理程序是异步运行的,可能会聚合多个SIGCHLD调用

简而言之,最好不要使用它,只要你不知道它是如何工作的

你的程序还有另一个问题:如果你一次收到10000条消息会发生什么?您将总共生成10000个进程并杀死您的机器

您可以使用一个代理,让它为您处理所有这些问题

from multiprocessing import Pool


class MQListener(object):
    def __init__(self):
        self.pool = Pool()
        self.rabbitclient = RabbitMQ()

    def new_message(self, message):
        self.pool.apply_async(do_job, args=(message, ))

    def run(self):
        self.rabbitclient.listen("task_queue", self.new_message)


app = MQListener()
app.run()

我建议你重新措辞最后一句话。要求工具/库推荐的问题往往会吸引垃圾邮件。此类问题也被视为离题。如果您已经安装了RabbitMQ,则可以尝试。如果您的代码操纵
SIGCHLD
,则您有责任获取子进程。
w.join()
最终会调用
waitpid()
模拟吗?谢谢回复。一般来说,很多消息都没有问题,因为有一种机制,当没有容量(子流程限制)时,它可以简单地重新查询消息。我猜是这样的,但当系统的所有组件都是这样时,系统是健壮的;)
from multiprocessing import Pool


class MQListener(object):
    def __init__(self):
        self.pool = Pool()
        self.rabbitclient = RabbitMQ()

    def new_message(self, message):
        self.pool.apply_async(do_job, args=(message, ))

    def run(self):
        self.rabbitclient.listen("task_queue", self.new_message)


app = MQListener()
app.run()