質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4814閲覧

[Python2.7]multiprocessingで並列処理を行う関数内から変数を参照する方法について

iarik

総合スコア101

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/11/01 04:36

編集2016/11/01 04:40

###実装したいこと
main処理内で作成した変数を、multiprocessingを使って実行される関数内から参照したい

###ソースコード

from multiprocessing import Pool, cpu_count import time stack = [] cpu = '' def slowf(x): time.sleep(1) return x*cpu if __name__ == '__main__': st = time.time() cpu = cpu_count() * 2 p = Pool(cpu) stack = p.map(slowf, range(1,11)) print stack #print('cpu : %d' % cpu_count()) print ('stack count : %d' % len(stack)) print('time : %.3f s' % (time.time()-st))

###実行結果
slowf内でcpu変数の値を参照できていないため、skackに記録された値が全てnullとなってしまいました

['', '', '', '', '', '', '', '', '', ''] stack count : 10 time : 2.482 s

グローバル変数で宣言された値は参照出来ることは把握しておりますが、今回のようにmainの中で処理を行い変数に格納した値を並列処理される関数から参照したい場合は、どの様にコーディングすればよいでしょうか。。。。。
###補足
実行環境:windows 7 32bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

multiprocessing で生成した slowf は、その名の通り別のプロセスで動いているため、ふつうの方法ではオブジェクトを共有することはできません。

今回の cpu のようにずっと値が変わらないであれば引数として渡してあげましょう。一方で、プログラム実行中にプロセスのどれかが値を書き換え、それを他のプロセスが参照する必要がある場合は 共有メモリ や サーバープロセス を使います。→ multiprocessing - プロセス間での状態の共有

ただ、Pool.map() は複数の引数を渡せない仕様のため、こんな感じでラッパー関数をつかってムリやり渡します。

python

1from multiprocessing import Pool, cpu_count 2import time 3 4def argwrapper(args): 5 return args[0](*args[1:]) 6 7def slowf(x, cpu): 8 time.sleep(1) 9 return x*cpu 10 11if __name__ == '__main__': 12 st = time.time() 13 cpu = cpu_count() * 2 14 p = Pool(cpu) 15 func_args = [] 16 for x in range(1,11): 17 func_args.append((slowf, x, cpu)) 18 stack = p.map(argwrapper, func_args) 19 print(stack) 20 print('stack count : %d' % len(stack)) 21 print('time : %.3f s' % (time.time()-st))

投稿2016/11/01 08:21

編集2016/11/01 08:22
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iarik

2016/11/01 11:33

お忙しいところ、ご回答ありがとうございます。 マルチプロセスかつPool.map()の仕様で、ご回答頂いたような方法を使わないと実行できないこと理解しました。 今の自分では、流石にPython公式のドキュメントからは導き出せるロジックではなかったので大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問