2016-08-25 3 views
1

私はdictの値のフラットなリスト(「キー」と呼ばれる)を返す関数を並列化したいが、最終結果を得る方法は分からない。私が試してみました:toParallelファンクションキーとしてハッシュタグと(キーがintです)キーのリストと辞書を返すべきPythonマルチプロセッシング - dictを返す

def toParallel(ht, token): 
    keys = [] 
    words = token[token['hashtag'] == ht]['word'] 
    for w in words: 
     keys.append(checkString(w)) 
    y = {ht:keys} 

num_cores = multiprocessing.cpu_count() 
pool = multiprocessing.Pool(num_cores) 

token = pd.read_csv('/path', sep=",", header = None, encoding='utf-8') 
token.columns = ['word', 'hashtag', 'count'] 
hashtag = pd.DataFrame(token.groupby(by='hashtag', as_index=False).count()['hashtag']) 

result = pd.DataFrame(index = hashtag['hashtag'], columns = range(0, 21)) 
result = result.fillna(0) 

final_result = [] 
final_result = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']] 

。私はfinal_result印刷しようとする場合でも、私は

が、私はそれを行うことができますどのように0x10c4fa950

でmultiprocessing.pool.ApplyResultオブジェクトのメソッドApplyResult.getを拘束得ますか?

答えて

1
final_result = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']] 

あなたはPool.apply()を使用すると、すぐに結果を取得する(この場合、あなたが笑、機能は完全性のためだけでありmultiprocessingを必要としない)、またはPool.get()により、次のPool.apply_async()を使用することができます。 Pool.apply_async()非同期です。このような

何か:

workers = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']] 
final_result = [worker.get() for worker in workers] 

また、あなたもあなたのためのすべてのこれを行いますPool.map()を使用することができます。

いずれにせよ、私は慎重にthe documentationを読むことをお勧めします。


補遺:私はOPはLinuxやOSXのようないくつかのUnixオペレーティングシステムを使用していると推測この質問に答えます。 Windowsを使用している場合は、if __name__ == '__main__'を使用して親/ワーカープロセスを守ることを忘れないでください。これは、Windowsにはfork()が足りないため、子プロセスはファイルの先頭から開始され、Unixのような分岐の時点では開始されないため、if条件を使用してガイドする必要があります。 hereを参照してください。


PS:これは不要です。

num_cores = multiprocessing.cpu_count() 
pool = multiprocessing.Pool(num_cores) 

あなたは引数なしでmultiprocessing.Pool()(またはNone)を呼び出した場合、それはすでにあなたのCPU数の大きさで、労働者のプールを作成します。

関連する問題