2017-05-04 10 views
-1

私は、任意の関数を並列に実行するために、以下のヘルパー関数を記述しました。Pythonマルチプロセッシングのプールは何もしません

import multiprocessing 


def runParallel(fns=[], args=[]): 
    print('Starting multiprocessing with %i cores' % (multiprocessing.cpu_count() - 1)) 
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() - 1) 
    for fn, arg in zip(fns, args): 
     pool.apply_async(fn, (arg,)) 
    pool.close() 
    pool.join() 

Iは、関数の呼び出しitertools.repeatで関数を呼び出してファイル名のリストが

runParallel(itertools.repeat(self.processFile), fileNamesAndPaths) 

processFile署名

def processFile(self, filename): 

とクラスメソッドであると始まります'print' - 決して実行されない文。このプログラムは、出力「3コアによるマルチプロセッシングの開始」の後に終了します。

一般的に作品をマルチプロセッシングからプロセスを使用したが、それはそれは扱うことができないプロセスの量と私のCPUをフラッディングし、最終的にフリーズしますが、少なくともprocessFile機能は、私がしたかった理由です

from multiprocessing import Process 


def runParallel(fns=[], args=[]): 
    proc = [] 
    for fn, arg in zip(fns, args): 
     p = Process(target=fn, args=(arg,)) 
     p.start() 
     proc.append(p) 
    for p in proc: 
     p.join() 

と呼ばれています私の理解から、いつでもプロセス量を処理できるので、プールを使用してください。

もし私が64ビットWindowsマシンで2.7.10でこれを実行すると便利です。

+0

あなたは 'Process'と' fn' ==インスタンスメソッドで動作すると言っていますか? –

+0

@PeterWoodはい、それは私がリストに約300のファイルがあるので、プログラムは20秒後に私のPCをクラッシュする300のプロセスを作成します。 – NoMonkey

答えて

-1

エラー出力を表示するには、apply_asyncapplyと置き換えることができます。 Btw、それはpython3で動作します、私はpython2.7についてはわかりません。

+0

コメントのコードを正しく書式設定する方法がわからないので、最後の行を投稿してください: 'cPickle.PicklingError:pickle >:属性検索__builtin __。instancemethod failed' クラスメソッドを処理できませんか? – NoMonkey

+0

@NoMonkey http://stackoverflow.com/questions/1816958/cant-pickle-type-in​​stancemethod-when-using-pythons-multiprocessing-pool-maまだbtw、あなたの質問を編集してコードを投稿することができます。 – Sraw

+0

リンクありがとうございます。私はこの問題を私に助けたこの[リンク](http://stackoverflow.com/questions/1816958/cant-pickle-type-in​​stancemethod-when-using-pythons-multiprocessing-pool-ma/7309686#7309686)を見つけた – NoMonkey

関連する問題