0

私は、テストクラス 'APMSim'を別のスレッドでインスタンス化して閉じる非常に簡単なテストフィクスチャを持っています。これが起こる可能性がなぜPythonマルチプロセッシングPool.imap throw ValueError:list.remove(x):xがリストにありません

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 

:私は次のようなエラーが発生したunittestの私は、空のPythonを実行すると、

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 

しかし:私は、プロセス間で転送され、それらを避けるためにPool.imapをマルチプロセッシングを使用する必要がありますか?これに修正がありますか?

答えて

1

multiprocessingは、親プロセスのワーカー関数/子プロセスから例外を再発生させますが、子プロセスから親プロセスへの転送でトレースバックを失います。あなたのワーカー機能をチェックしてください、それは間違っているコードです。それはあなたの労働者の機能があるものは何でも取るために役立つと変更される可能性があります:

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

に:

import traceback 

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

これは、明示的にフル、元の例外のトレースバック(それが正常に伝播することができます)を出力しますので、あなたが見ることができます本当の問題は何か

+0

ありがとうございました!しかし、これはマルチプロセッシングが不公平なライブラリであることも意味します。良いライブラリはエラー情報を隠さないでしょう – tribbloid

+0

また、このブロックは何度も使用されていますので、私はそれを関数注釈にしたいと思いますが、関数のpicklabilityを失うことはありません。同時にエラー情報を表示しますか? – tribbloid

+0

@tribbloid:完全なスタック情報を子から親に転送するのは自明ではありませんが、Py3では実際にそれを修正するかもしれません。 7歳のPythonを使用すると、より多くの癖があります。注釈ビットでちょっと騙して、その関数を引数としてラッパーに渡すことができます。 'mywrapper'は' realfunc、arg = args'、 'realfunc(arg)'を含む 'try'ブロックの本体をちょうど持つ' map(mywrapper、zip(itertools.repeat(realfunc)、o​​rigarguments)) ''です。 – ShadowRanger

関連する問題