2017-06-06 45 views
3

を完了しない私は、マルチプロセッシングでのpython 2.7を使用しています::プールを並列Pythonの:マルチプロセッシングは、ジョブズ

でジョブを実行するために、私は以下の例を簡略化してきたが、ここでの主な要点です。

apply_async()機能を使用して、自分の個人用のファイルを作成します。しかし、ファイルが正しく作成されたかどうかを確認すると、ファイルが作成されていないことがあります。

今、私は私がマルチプロセッシングを使用する方法で何かを間違ってやった::プール

何かアドバイスを考えていますか?

import os 
from multiprocessing import Pool 

def outputFile(person): 
    ofh=open(person+'.txt','w') 
    ofh.write('test\n') 
    ofh.close() 

pool = Pool(processes=4) 
for person in person_dict: 
    pool.apply_async(outputFile,args(person)) 
pool.close() 
pool.join() 
for person in person_dict: 
    print os.path.isfile(person+'.txt') 

True 
True 
False 
True 

答えて

1

これはperson_dictの内容に関連していませんか?

私はあなたのコードを変更し、それを何度も実行しました。彼らはすべて期待される結果を生み出しました。

import os 
from multiprocessing import Pool 

def outputfile(person): 
    with open(person+'.txt','w') as ofh: 
     ofh.write('test\n') 

person_dict = {'a': 'a', 'b': 'b', 'c':'c', 'd':'d'} 

pool = Pool(processes=4) 
for person in person_dict: 
    pool.apply_async(outputfile, (person)) 
pool.close() 
pool.join() 

for person in person_dict: 
    print(os.path.isfile(person+'.txt')) 
+0

わかりません。通常、私はエラーが発生しない時間の99%を言うでしょう。しかし時にはプロセスが落ちて出力ファイルが形成されないことがあります。 – DolphinGenomePyramids

+0

呼び出しプロセスに表示されない子プロセスでIO例外またはランタイムエラーが発生することがあります。 – neurite

1

あなたがサブプロセスで例外をキャッチし、それらを自分で印刷されない場合は、あなたがそれらを見ることはありません。ここで

私が変更され、テストされたコードです。

import os 
from multiprocessing import Pool 

def outputFile(person): 
    raise Exception("An exception") 

pool = Pool(processes=4) 
for person in range(100): 
    pool.apply_async(outputFile, args=(person,)) 
pool.close() 
pool.join() 

あなたはすべての例外をキャッチし、手動でトレースバックを印刷する必要があります:

import os 
from multiprocessing import Pool, Lock 
import traceback 

print_lock = Lock() 

def outputFile(person): 
    try: 
     raise Exception("An exception") 
    except: 
     with print_lock: 
      print "%s: An exception occurred" % person 
      print traceback.format_exc() 

pool = Pool(processes=4) 
for person in range(100): 
    args = (person, print_lock) 
    pool.apply_async(outputFile, args=(person,)) 
pool.close() 
pool.join() 

出力

0: An exception occurred 
Traceback (most recent call last): 
    File "person.py", line 9, in outputFile 
    raise Exception("An exception") 
Exception: An exception 

1: An exception occurred 
Traceback (most recent call last): 
    File "person.py", line 9, in outputFile 
    raise Exception("An exception") 
Exception: An exception 

... 

99: An exception occurred 
Traceback (most recent call last): 
    File "person.py", line 9, in outputFile 
    raise Exception("An exception") 
Exception: An exception 

注:print_lockは次のプログラムでは、出力を生成しません出力がインターリーブされないようにします。

関連する問題