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

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

ただいまの
回答率

90.50%

  • Python 3.x

    6419questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 211

ebizo

score 2

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にどう読み込めばいいのかわかりませんでした。
ご意見頂けるとありがたいです。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/07/02 19:55

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

    キャンセル

回答 2

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 20:56

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

    キャンセル

+1

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

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

from multiprocessing import Pool, Value, Array
import multiprocessing

x = Array("i", range(100))

def func1():
    i = 0
    global x
    while i<10:
        x[i] = i*i
        i += 1

def func2(i):
    global x
    if x[i] % 2 == 0:
        print("偶数")
        return x[i]

p = Pool(processes=multiprocessing.cpu_count(),
         initializer=func1, initargs=())
p.map(func2, range(15))

パルプンテコード。

from multiprocessing import Pool, Value, Array, Queue, Process
import multiprocessing
import time
import random

random.seed(0)

y = Value("i")

def func(q, inc):
    global y
    while y.value<100:
        q.put(y.value)
        print(inc)
        y.value += inc
        time.sleep(random.random()/10.)

q = Queue()
p0 = Process(target=func, args=(q, 5,))
p1 = Process(target=func, args=(q, 10,))
p2 = Process(target=func, args=(q, -2,))
p0.start()
p1.start()
p2.start()
time.sleep(5)
print([q.get() for _ in range(q.qsize())])

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 20:54

    コメント頂きありがとうございます。
    またコードもありがとうございます。動作させて確認します。

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

    無限ループに関しては、意図的にしておりました。

    キャンセル

  • 2018/07/02 22:44

    少なくとも今はバリアの処理がないので、一般的にはfunc1とfunc2でデータをやりとりしながら並列処理することになっていません。

    initializerに無限ループが入っているので、関数が呼ばれることはないのでは?

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6419questions

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