回答編集履歴

1

コード追記

2021/11/21 17:52

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -19,3 +19,173 @@
19
19
  読み出し順序の制御が必要になってくるので、
20
20
 
21
21
  必然的に、非同期ではなく同期コードとなってしまいます。
22
+
23
+
24
+
25
+ ----
26
+
27
+ コードを追記
28
+
29
+
30
+
31
+ ```python
32
+
33
+ # 恐らく期待されている挙動をするコード
34
+
35
+ # Event オブジェクトでキューからの読み出しを待ちます
36
+
37
+
38
+
39
+ from multiprocessing import Process, Queue, Event
40
+
41
+
42
+
43
+ def something(queue, event):
44
+
45
+
46
+
47
+ print("1")
48
+
49
+ args = queue.get()
50
+
51
+ event.set()
52
+
53
+ print("2")
54
+
55
+
56
+
57
+ for i in range(len(args)):
58
+
59
+
60
+
61
+ args[i] = args[i]**2
62
+
63
+
64
+
65
+ queue.put(args)
66
+
67
+
68
+
69
+
70
+
71
+ if __name__ == "__main__":
72
+
73
+
74
+
75
+ event = Event()
76
+
77
+ test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
78
+
79
+ test_queue = Queue()
80
+
81
+ test_queue.put(test_list)
82
+
83
+
84
+
85
+ p = Process(target = something, args = (test_queue, event))
86
+
87
+
88
+
89
+ p.start()
90
+
91
+ event.wait() # プロセス側で読み出されるまで待機
92
+
93
+
94
+
95
+ result = test_queue.get()
96
+
97
+
98
+
99
+ p.join()
100
+
101
+
102
+
103
+ print(result)
104
+
105
+
106
+
107
+ ```
108
+
109
+
110
+
111
+
112
+
113
+ ```python
114
+
115
+ # 2つのqueue を使う例
116
+
117
+ # queueA ... メインで put 子プロセスで get
118
+
119
+ # queueB ... 子プロセスで put メインで get
120
+
121
+
122
+
123
+ from multiprocessing import Process, Queue
124
+
125
+
126
+
127
+ def something(queueA, queueB):
128
+
129
+
130
+
131
+ print("1")
132
+
133
+ args = queueA.get()
134
+
135
+ print("2")
136
+
137
+
138
+
139
+ for i in range(len(args)):
140
+
141
+
142
+
143
+ args[i] = args[i]**2
144
+
145
+
146
+
147
+ queueB.put(args)
148
+
149
+
150
+
151
+
152
+
153
+ if __name__ == "__main__":
154
+
155
+
156
+
157
+ test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
158
+
159
+ queueA = Queue()
160
+
161
+ queueB = Queue()
162
+
163
+ queueA.put(test_list)
164
+
165
+
166
+
167
+ p = Process(target = something, args = (queueA, queueB))
168
+
169
+ p.start()
170
+
171
+
172
+
173
+ result = queueB.get()
174
+
175
+
176
+
177
+ p.join()
178
+
179
+
180
+
181
+ print(result)
182
+
183
+ ```
184
+
185
+
186
+
187
+ ※ print() はマルチプロセスで使うには注意が必要です。
188
+
189
+ マルチプロセスでのログ出力はlogging モジュールの QueueHandler を調べて見て下さい。
190
+
191
+ https://docs.python.org/ja/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes