2017-01-03 2 views
2

私はいくつかの機能の速度を上げるためにPythonでいくつかのマルチプロセッシングを使用しようとしていますが、私はプロセスの作成に大きなコストがかかることを知っていますが、私はいくつかのマルチプロセッシングがそのトリックを行うことができると考えていました。複数の処理がシーケンシャルなPython 3.5より遅い

私は間違っていました(大きなwhoop)マルチ処理が遅くなったり、少なくとも高速ではないようでした。

for i in range(0, 3): 
    for j in range(0, 3): 
     result = my_function(my_args) 

そして今、私はマルチプロセッシングを持っているもの:

pool = Pool() 

for i in range(0, 3): 
    for j in range(0, 3): 
     result = pool.apply_async(my_function,my_args).get() 

pool.close() 
pool.join() 

私はmy_functionのブツと実際の機能を置き換えるので、私は、マルチプロセッシングの前に持っていたもの、ここでいくつかのコンテキストを入れて 私の機能は、基本的に読むためのお尻の痛みです。

マルチプロセッシングを使用する場合の作業負荷は小さいですか、何か間違っていますか?

EDIT:

いくつかは、私が参加した後、最後にそれを使用するために必要な今、私は時々ポップランダムな例外を持つたびに、取得に使用するので、それはシーケンシャルに働いていた言ったように、ここでのトレースバックの終わり:

ファイル "/home/rtodo/anaconda3/lib/python3.5/multiprocessing/pool.py"、ライン608は、get レイズself._value はIndexError中:のうちポップインデックス範囲

ここに私のコードが修正されました

pool = Pool() 
for i in range(0, 3): 
    for j in range(0, 3): 
     neigbhourhood[i][j] = pool.apply_async(my_function,my_args) 



for k in range(0, 3): 
    for l in range(0, 3): 
      neigbhourhood[i][j] = neigbhourhood[i][j].get() 

pool.close() 

ここで、neigbhourhoodは3x3配列です。

編集の編集: 私はちょっとコードを変更しましたが、現在はプールが終了した後に閉じられ、私は参加しません。

+3

どのプロセッサとOSを使用しますか?さらに、そのコードは実際にパラレルで関数呼び出しを実行しますか?私はそれが次の呼び出しを開始する前に結果を待つように直列にそれを実行すると思います。 – skyking

+1

最初に 'get()'を呼び出すべきではありません。すべてのジョブが実行された後に 'get()'を呼び出します。スカイキングのように、あなたは一連のことを実行しています。 – justhalf

+0

私はDebianにあり、Intel Core i3-4005U 1.7 GHzを持っています。関数呼び出しはparallellで実行されています。私は正直なところ考えませんでした。私はPythonのマルチプロセッシングに慣れていないので、わかりませんそうすることは、パラレルを行う正しい方法です。 –

答えて

4

.get()は処理が完了するまで待機するので、2つの例には(実際の)違いはありません。したがって、あなたのマルチプロセスの例も同様に順番になりますが、異なるノードでプロセスが生成されるので、時間がかかるでしょう。

まずすべてのプロセスを起動し、その後の結果を待ちます。メインプロセスが子プロセスよりも早く終了しますということはできませんので

pool = Pool() 
futures = [] 
for i in range(0, 3): 
    for j in range(0, 3): 
     futures.append(pool.apply_async(my_function,my_args)) 

# You can also make some additional calculation here if you want 

# 
# Lets see if the multiprocess stuff is finished 
for i in futures: 
    i.get() 


pool.close() 
# pool.join() 

あなたは、同様.join()を残すことができます。

+0

ええ、あなたは正しいですが、今私は奇妙なエラーがポップ時々ポップ、編集を参照してください。 –

+0

どちらの行は608ですか?私が '.join()'と述べたように、役に立たないし、問題を引き起こすかもしれない。 –

+0

また、タスクが完了する前にプールを閉じています。それはしないでください。 –

関連する問題