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