Python多处理Pool.imap抛​​出ValueError:list.remove(x):x不在列表中

时间:2016-10-15 05:35:40

标签: python python-2.7 python-multiprocessing python-unittest

我有一个非常简单的测试工具,它在不同的线程中实例化并关闭测试类'APMSim',该类不可选,因此我必须使用多处理Pool.imap来避免它们在进程之间传输:

class APMSimFixture(TestCase):

    def setUp(self):
        self.pool = multiprocessing.Pool()
        self.sims = self.pool.imap(
            apmSimUp,
            range(numCores)
        )

    def tearDown(self):
        self.pool.map(
            simDown,
            self.sims
        )

    def test_empty(self):
        pass

但是,当我运行空的Python unittest时,遇到以下错误:

Error
Traceback (most recent call last):
  File "/home/peng/git/datapassport/spookystuff/mav/pyspookystuff_test/mav/__init__.py", line 87, in tearDown
    self.sims
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
    raise self._value

为什么会发生这种情况?有没有解决这个问题?

1 个答案:

答案 0 :(得分:1)

multiprocessing正在从父进程中的worker function / child进程重新引发异常,但它在从子进程到父进程的传输中丢失了回溯。检查你的工作人员功能,那就是代码出错了。它可能有助于你的工作职能是什么并改变:

def apmSimUp(...):
    ... body ...

为:

import traceback

def apmSimUp(...):
    try:
        ... body ...
    except:
        traceback.print_exc()
        raise

这显式打印完整的原始异常回溯(然后让它正常传播),这样你就可以看到真正的问题是什么。