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

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

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

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

並列処理

複数の計算が同時に実行される手法

Python

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

Q&A

解決済

1回答

3153閲覧

multiprocessing の Queue からget()で値を取得できない。

kingsman3312

総合スコア7

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

並列処理

複数の計算が同時に実行される手法

Python

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

0グッド

0クリップ

投稿2021/11/21 08:20

以下のコードを実行すると、関数something内のqueue.get()の所で処理が止まります。
queueにはリストをputしているのですが...
原因が分かる方がいましたらご教授下さい。

python

1from multiprocessing import Process, Queue 2 3def something(queue): 4 5 print("1") 6 args = queue.get() 7 print("2") 8 9 for i in range(len(args)): 10 11 args[i] = args[i]**2 12 13 queue.put(args) 14 15 16if __name__ == "__main__": 17 18 test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] 19 test_queue = Queue() 20 test_queue.put(test_list) 21 22 p = Process(target = something, args = (test_queue,)) 23 24 p.start() 25 26 result = test_queue.get() 27 28 p.join() 29 30 print(result) 31 32##出力 33#1

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: 最初にputしたリストは、先にメインプロセス側で読み出されてます。

解決策:
戻り値をメインプロセス側で受けたい場合は、
送信用・受信用に2つのキューを準備します。

同じキューを双方で使いまわすのは、
可能ですがマルチプロセスの利点が薄れます
読み出し順序の制御が必要になってくるので、
必然的に、非同期ではなく同期コードとなってしまいます。


コードを追記

python

1# 恐らく期待されている挙動をするコード 2# Event オブジェクトでキューからの読み出しを待ちます 3 4from multiprocessing import Process, Queue, Event 5 6def something(queue, event): 7 8 print("1") 9 args = queue.get() 10 event.set() 11 print("2") 12 13 for i in range(len(args)): 14 15 args[i] = args[i]**2 16 17 queue.put(args) 18 19 20if __name__ == "__main__": 21 22 event = Event() 23 test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] 24 test_queue = Queue() 25 test_queue.put(test_list) 26 27 p = Process(target = something, args = (test_queue, event)) 28 29 p.start() 30 event.wait() # プロセス側で読み出されるまで待機 31 32 result = test_queue.get() 33 34 p.join() 35 36 print(result) 37

python

1# 2つのqueue を使う例 2# queueA ... メインで put 子プロセスで get 3# queueB ... 子プロセスで put メインで get 4 5from multiprocessing import Process, Queue 6 7def something(queueA, queueB): 8 9 print("1") 10 args = queueA.get() 11 print("2") 12 13 for i in range(len(args)): 14 15 args[i] = args[i]**2 16 17 queueB.put(args) 18 19 20if __name__ == "__main__": 21 22 test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] 23 queueA = Queue() 24 queueB = Queue() 25 queueA.put(test_list) 26 27 p = Process(target = something, args = (queueA, queueB)) 28 p.start() 29 30 result = queueB.get() 31 32 p.join() 33 34 print(result)

※ print() はマルチプロセスで使うには注意が必要です。
マルチプロセスでのログ出力はlogging モジュールの QueueHandler を調べて見て下さい。
https://docs.python.org/ja/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes

投稿2021/11/21 09:11

編集2021/11/21 17:52
teamikl

総合スコア8664

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

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

kingsman3312

2021/11/21 10:26

送信用、受信用に二つのキューを用意したときのコードを書いてくれると嬉しいです。 うまく理解が出来ませんでした。 よろしくお願いします。
teamikl

2021/11/21 17:41

問題点は把握されましたか?どの点が理解できないのでしょう? - queue を2つ作りプロセスに渡して、 - 片方はメインから put サブプロセスで get - もう片方は サブプロセスで put メイン側で get 少し複雑になりますが、上から2つ目の例です。親プロセスに結果を返すコード例 > passing results back to the parent process https://pymotw.com/3/multiprocessing/communication.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問