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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

4481閲覧

並列処理において、プロセス間で変数を共有したい

ebizo

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/02 10:10

編集2022/01/12 10:55

python初心者かつ初質問です。
宜しくお願い致します。

現在、python3で並列処理の練習をしております。
実行したいのは下記になります。
・func1:データをxに保存し続ける(xは常に更新)
・func2:func1のxを読み込み、処理する(偶数なら偶数と表示)
※あくまで並列処理の練習です。

from multiprocessing import Pool, Value, Array def func1(): i = 0 x = [] while True: x.append = i*i i += 1 def func2(): while True: if x[i] % 2 == 0: print("偶数") p = Pool(processes=multiprocessing.cpu_count(), initializer=func1, initargs=()) p.map(func2)

下記サイトを参考にしましたが、うまく実装できませんでした。
https://qiita.com/ryousuke_nasuno/items/b8a30513c2110e5f9ae3

中でも、func1のxをfunc2にどう読み込めばいいのかわかりませんでした。
ご意見頂けるとありがたいです。

宜しくお願い致します。
質問の追記が必要であれば遠慮なくご指摘ください。

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

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

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

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

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

hayataka2049

2018/07/02 10:55

x.append = i*iが何をしているかわかっていますか? 並列処理の練習の前に勉強しないといけないことがたくさんあると思うのですが
guest

回答2

0

なにをやりたいのかさっぱりわかりませんが、とりあえず動くコードを。

マルチプロセスでも無限ループは永遠に終わりませんよ。

python

1from multiprocessing import Pool, Value, Array 2import multiprocessing 3 4x = Array("i", range(100)) 5 6def func1(): 7 i = 0 8 global x 9 while i<10: 10 x[i] = i*i 11 i += 1 12 13def func2(i): 14 global x 15 if x[i] % 2 == 0: 16 print("偶数") 17 return x[i] 18 19p = Pool(processes=multiprocessing.cpu_count(), 20 initializer=func1, initargs=()) 21p.map(func2, range(15))

パルプンテコード。

python

1from multiprocessing import Pool, Value, Array, Queue, Process 2import multiprocessing 3import time 4import random 5 6random.seed(0) 7 8y = Value("i") 9 10def func(q, inc): 11 global y 12 while y.value<100: 13 q.put(y.value) 14 print(inc) 15 y.value += inc 16 time.sleep(random.random()/10.) 17 18q = Queue() 19p0 = Process(target=func, args=(q, 5,)) 20p1 = Process(target=func, args=(q, 10,)) 21p2 = Process(target=func, args=(q, -2,)) 22p0.start() 23p1.start() 24p2.start() 25time.sleep(5) 26print([q.get() for _ in range(q.qsize())])

投稿2018/07/02 11:23

編集2018/07/02 14:27
mkgrei

総合スコア8560

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

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

ebizo

2018/07/02 11:54

コメント頂きありがとうございます。 またコードもありがとうございます。動作させて確認します。 >なにがやりたいのかさっぱりわかりません 質問内容に記載している内容(データを更新し続けるfunc1と更新し続けるデータを受け取って処理するfunc2を並列処理させたい)では不十分でしたでしょうか? 大学で類似課題が出たので、コードをそのまま記載するのもまずいかと思い、中身を変えて同様の質問を致しました。お気を悪くされたなら失礼致しました。 無限ループに関しては、意図的にしておりました。
mkgrei

2018/07/02 13:44

少なくとも今はバリアの処理がないので、一般的にはfunc1とfunc2でデータをやりとりしながら並列処理することになっていません。 initializerに無限ループが入っているので、関数が呼ばれることはないのでは?
guest

0

下記サイトを参考にしましたが、うまく実装できませんでした。

いや、それをうまく実装してください、としか言いようがありません。

初心者と言うなら、いきなりマルチプロセスに行くんじゃなくて、マルチスレッドから始めたらどうですか?
それなら変数の共有は簡単です

投稿2018/07/02 10:36

y_waiwai

総合スコア87719

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

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

ebizo

2018/07/02 11:56

コメントありがとうございます。 マルチスレッドの方が初心者にはとっつきやすいのですね。ありがとうございます。 検索して自ら試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問