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