python3多处理中的异常捕获

2024-09-29 23:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我的用例是捕捉python多处理进程中发生的所有异常。所以在一些网络搜索的帮助下,我想出了以下代码:

import multiprocessing as mp

class Process(mp.Process):
    def __init__(self, *args, **kwargs):
        mp.Process.__init__(self, *args, **kwargs)
        self._pconn, self._cconn = mp.Pipe()
        self._exception = None

    def run(self):
        try:
            mp.Process.run(self)
            self._cconn.send(None)
        except Exception as e:
            tb = traceback.format_exc()
            self._cconn.send((e, tb))

    @property
    def exception(self):
        if self._pconn.poll():
            self._exception = self._pconn.recv()
        return self._exception

然后在我的主代码中,我捕捉到以下错误:

^{pr2}$

这对轻活儿来说效果很好(比如10分钟内完成1000次)。但是当任务繁重(1000个工作在3小时内完成)时,后续的运行就很慢了。我发现有两件事我正在寻求解决办法:

1)当代码运行时,会创建许多进程(当我在命令行上选中top时),大多数进程什么都不做,也不会减慢运行时的速度。这是我忽视的问题吗?在

2)当我运行一个重任务时,所有后续的重任务都会被延迟。这似乎是因为有一些剩余的进程从旧的繁重的工作中遗留下来,并继续与新的运行分担负载。在

代码是否提供了任何提示,为什么我的运行不是傻瓜证明和显示可变的运行时间?在

请随时询问具体细节,我将提供他们,我不确定可能需要什么,所以我开始一个普遍的查询。在

编辑1: 下面是我如何创建流程

jobs = []
for i in range(num_processes):
    p = Process(target=func, args=(inqueue, outqueue))
    jobs.append(p)
    p.start()

Tags: run代码selfnone进程initdefas

热门问题