2017-06-16 14 views
0

マルチプロセッシングライブラリ(python 3.5)を使用しようとすると、終了しない関数に直面しています。Pythonマルチプロセッシング:インポートされた関数が終了しない

# Main.py 

import multiprocessing as mp 
import pandas as pd 
from dosomething import dosomething 

csvfolder = 'data/' 

data = pd.DataFrame([ 
     {'a':12,'b':13}, 
     {'a':2,'b':14}, 
     {'a':1,'b':23}, 
     {'a':123,'b':16}, 
     {'a':142,'b':14}, 
     ]) 

print('start') 

result = mp.Queue() 
dos = mp.Process(target=dosomething, args=(data,csvfolder,result,'dosomething')) 
dos.start() 
dos.join() 
result.get() 
print('finished') 

そしてdoSomethingの中で、私は次ない関数のdoSomethingを定義している:次のように私の現在の設定がある

すべてが処理されるように見えますが(メイン)プログラムは続行されません...

# dosomething.py 
import os 
def dosomething(data,csvfolder,result,name): 
    data.to_csv(os.path.join(csvfolder,'test.csv')) 
    result.put({name:{'data':data}}) 

この関数は期待通りに実行されますが、メインプログラムが停止することはありません。

プロセスプロセス-1:トレースバック(最新の呼び出しの最後):プログラムを終了するとき、私はメッセージを以下取得、 "/usr/lib/python3.5/multiprocessing/process.pyを" ファイル、行252 _bootstrap util._exit_functionで()( _exit_function _run_finalizersで、 "/usr/lib/python3.5/multiprocessing/util.py"、ライン314ファイル)「/usr/lib/python3.5/multiprocessing/ファイルutil.py コール RES = self._callback(*セルフで、/usr/lib/python3.5/multiprocessing/util.py "ライン186」を、ライン254は、 _run_finalizersに ファイナライザ()ファイル"。 _args、** self ._kwargs)ファイル "/usr/lib/python3.5/multiprocessing/queues.py"、198行目、 _finalize_join thread.join()ファイル "/usr/lib/python3.5/threading.py"、行1054で self._wait_for_tstate_lock()_wait_for_tstate_lock ELIFのlock.acquire(ブロック、タイムアウト)に、ライン1070 "/usr/lib/python3.5/threading.pyを" ファイル参加:KeyboardInterrupt

ベース私は、result.put()が(実際のデータを使用している場合)多くの時間が応答しなくなることを知りました。私がこのキューに置いている結果は、2つの要素を持つ辞書です。そのうちの1つは、パンダのデータフレーム(数百のレコード数)です。

どうすればこの問題を解決できますか?

+0

私はあなたのコードを実行し、それは正常に動作します。これはtest.csvを作成し、 "finished"を出力して終了します。 – Hannu

+0

あなたのコメントに基づいて質問を編集しました。 –

答えて

0

multiprocessing guidelines

...キューを使用するたびに、キューに入れられたすべてのアイテムが最終的にプロセスに参加する前に削除されるようにする必要があります。

Process.joinQueue.get行を交換するだけで問題なく動作します。

関連する問題