我有一个非常简单的测试工具,它在不同的线程中实例化并关闭测试类'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
为什么会发生这种情况?有没有解决这个问题?
答案 0 :(得分:1)
multiprocessing
正在从父进程中的worker function / child进程重新引发异常,但它在从子进程到父进程的传输中丢失了回溯。检查你的工作人员功能,那就是代码出错了。它可能有助于你的工作职能是什么并改变:
def apmSimUp(...):
... body ...
为:
import traceback
def apmSimUp(...):
try:
... body ...
except:
traceback.print_exc()
raise
这显式打印完整的原始异常回溯(然后让它正常传播),这样你就可以看到真正的问题是什么。