問題点: 最初に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 10:26
2021/11/21 17:41