2017-04-21 8 views
1

私はPythonでマルチプロセッシングをしています。あなたが「2」に印刷された数字を見ることができる場合ワーカープロセスの例外

def a(num): 
    if(num == 2): 
     raise Exception("num can't be 2") 
    print(num) 


    p = Pool() 
    p.map(a, [2, 1, 3, 4, 5, 6, 7, 100, 100000000000000, 234, 234, 5634, 0000]) 

出力

3 
4 
5 
7 
6 
100 
100000000000000 
234 
234 
5634 
0 
multiprocessing.pool.RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
    File "<stdin>", line 3, in a 
Exception: Error, num can't be 2 
""" 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 260, in map 
    return self._map_async(func, iterable, mapstar, chunksize).get() 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 608, in get 
    raise self._value 
Exception: Error, num can't be 2 

:私は、労働者がその例外を発生させる場合、私は、次のコードを書いたhappendsかを判断しようとしていますそこにはありませんが、なぜナンバー1もそこにいませんか?

:私はデフォルトではUbuntuの

+1

12コアシステムで動作しているようです。 map()は、関数a()をリストの12個の項目に適用しますが、合計13個の項目がリストにあります。 '2'は例外を発生させるため、プログラムは '1'が処理される前に停止します。例外をラップして後で呼び出す方法については、[この回答](http://stackoverflow.com/a/26096355)を参照してください。 – pclrk

+0

プールはそのようには機能しません。労働者の数はコアに関連しており、コア数はnと2nの間でなければなりません。あなたは 'map()'に非常に多くの項目を渡すことができます。プールは、 'chunksize' paramが設定されている場合にはworkerのparamsで呼び出しを分割し、そうでなければworkerから項目を選択し、' a() '関数を呼び出します。前の項目など。私が間違っている場合は教えてください –

答えて

1

でPython 3.5.2を使用しています、プールはコアのあなたの数に等しい労働者の数を作成します。それらのワーカープロセスの1つが死ぬと、そのワーカープロセスに割り当てられた作業は元に戻すことができます。また、決してフラッシュされないバッファに出力を残すこともあります。 .MAP()の結果は、一対一の入力を有することになっているからである。

.MAP()のパターンは、労働者に例外を処理し、いくつかの適切なエラー値を返すことです

from multiprocessing import Pool 

def a(num): 
    try: 
     if(num == 2): 
      raise Exception("num can't be 2") 
     print(num, flush=True) 
     return num 
    except Exception as e: 
     print('failed', flush=True) 
     return e 

p = Pool() 
n=100 
results = p.map(a, range(n)) 

print("missing numbers: ", tuple(i for i in range(n) if i not in results)) 

ここにはhow exceptions propagate in multiprocessing.map workersについての詳しい情報がある別の質問があります。

関連する問題