在python3多处理中捕获异常

时间:2017-04-27 11:15:12

标签: python exception-handling multiprocess

我的用例是捕获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

然后在我的主要代码中,我按如下方式捕获错误:

for p in jobs:
    p.join()
    if p.exception:
        error, traceback = p.exception
        print(traceback)

这适用于轻型作业(比如说在10分钟内完成1000次)。但是当工作量很大(3小时内完成1000次)时,随后的运行速度很慢。我观察到有两件事我正在寻求解决方案:

1)当代码运行时,会创建很多进程(当我在命令行上检查顶部时),大多数进程都不执行任何操作并且不会减慢运行时间。这是我无视的问题吗?

2)当我从事繁重的工作时,所有后续繁重的工作都会被推迟。这似乎是因为旧的繁重工作中仍然存在一些剩余的进程,并继续与新运行共享负载。

代码是否提供了任何提示,为什么我的运行不是万无一失且显示可变的运行时间?

请随时询问具体细节,我会提供给他们,我不确定可能需要什么,所以我开始使用通用查询。

编辑1: 以下是我创建流程的方法

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

0 个答案:

没有答案