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

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

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

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

Q&A

解決済

3回答

7609閲覧

Pythonの並列処理で、ループするプロセス同士でデータを渡したい。

decoyxyz

総合スコア13

Python 3.x

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

1グッド

1クリップ

投稿2018/02/14 23:51

前提・実現したいこと

Python初心者です。Python3.6を利用しています。
multiprocessingでのマルチプロセスにおいて、プロセス間通信を行いたいです。

from multiprocessing import Process import time def f1(): i = 0 while True: i += 1 def f2(): while True: print (i) time.sleep(5) p1 = Process(target=f1) p2 = Process(target=f2) p1.start() p2.start()

常にループしている子プロセスの変数の最新の情報(i)を、また別の常にループしている子プロセスに渡したいです。
調べた文献の範囲では、子プロセスが止まるのを待って情報を取り出していたので、困っています。
現在は、SQLiteを用いて、HDD経由でデータを渡して凌いでいます。この方法は速度が遅いので改善したく思っています。

よろしくお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

Queueの利用により、無事、解決しました。
お二方、ありがとうございました!
実装したかった内容は、機器からリアルタイムで数値を取っていくプロセスが2つ(処理落ちできない)、キー入力から他のプロセスを停止させるプロセス、受け取った数値をまとめて処理して、画像化するプロセス(処理が重い)でした。
mutiprocessing.Valueも検討いたします、ありがとうございました。

Python

1from multiprocessing import Process, Queue 2import time 3 4def f1(q,q3):#送信1 5 i=0 6 while q3.empty(): 7 q.put("A"+str(i)) 8 i +=1 9 time.sleep(2) 10 11def f2(q,q3):#送信2 12 i=0 13 while q3.empty(): 14 q.put("B"+str(i)) 15 i +=1 16 time.sleep(3) 17 18def f3(q):#停止 19 time.sleep(20) 20 print("stop") 21 q.put(False) 22 23def f4(q1,q2,q3):#表示 24 while q3.empty(): 25 while not q1.empty(): 26 print(q1.get()) 27 while not q2.empty(): 28 print(q2.get()) 29 time.sleep(5) 30 31 32if __name__ == '__main__': 33 q1 = Queue() 34 q2 = Queue() 35 q3 = Queue() 36 p1 = Process(target=f1, args=(q1,q3)) 37 p2 = Process(target=f2, args=(q2,q3)) 38 p3 = Process(target=f3, args=(q3,)) 39 p4 = Process(target=f4, args=(q1,q2,q3)) 40 p1.start() 41 p2.start() 42 p3.start() 43 p4.start()

投稿2018/02/15 01:13

decoyxyz

総合スコア13

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 01:30

Queueのget()メソッドはアイテムを取得できるまでプロセスを一定時間ブロックさせることができます:get([block[, timeout]])。うまく使うと無駄にwhile文を回さずにプロセスを待機させることができます。少し発展的な内容かもしれませんが、必要でしたら確認してみてください。
decoyxyz

2018/02/15 01:42

ありがとうございます! アイテムを取得できるまでというのは、タイムアウトが5秒なら、5秒間待ち、それでも追加のデータがなければその行をスルーするという認識でいいでしょうか。
退会済みユーザー

退会済みユーザー

2018/02/15 01:52

タイムアウトが5秒で、その間にget()できない場合は、例外queue.Empty exceptionが上げられます。スルーさせるためにはこの例外をキャッチする必要があります。プロデューサー・コンシューマーパターンの時は、コンシューマーはただただ待ち続ければいいので、getによるブロックが有効ですが、decoyxyzさんの問題にあてはまるかはチェックしきれてないです。
decoyxyz

2018/02/15 01:59

ありがとうございます、承知しました! プロデューサー・コンシューマーパターンがなにか理解できていませんが、入力を受け付けたいときもあるので、実装したいと思います。
guest

0

投稿2018/02/15 00:44

YouheiSakurai

総合スコア6142

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

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

0

ベストアンサー

multiprocessingのQueueが使えるかもしれません。

https://docs.python.org/3/library/multiprocessing.html#exchanging-objects-between-processes

おそらくマルチプロセスを使ったプロデューサー・コンシューマーパターンの実装をしたいとお見受けしましたので、もしその場合ですと(英語ですが)こちらが参考になると思います。

https://stonesoupprogramming.com/2017/09/11/python-multiprocessing-producer-consumer-pattern/

投稿2018/02/15 00:05

編集2018/02/15 00:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問