回答編集履歴

3

2021/03/08 14:05

投稿

退会済みユーザー
test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
  -----------------------------
106
106
 
107
- コメントで質問があったので追記
107
+
108
108
 
109
109
  並行処理にならない例
110
110
 

2

コメント追加

2021/03/08 14:05

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,6 @@
1
1
  極力元のコードから変えないようにするなら、下記のような感じになるでしょうか。
2
2
 
3
-
3
+ (※18:07に質問が修正される前の質問文に対して作った回答のため、現時点の質問内容に対しては参考にならないかもしれません)
4
4
 
5
5
  ```python
6
6
 

1

追記

2021/03/08 14:05

投稿

退会済みユーザー
test CHANGED
@@ -99,3 +99,135 @@
99
99
  return dest11
100
100
 
101
101
  ```
102
+
103
+
104
+
105
+ -----------------------------
106
+
107
+ コメントで質問があったので追記
108
+
109
+ 並行処理にならない例
110
+
111
+
112
+
113
+ ```
114
+
115
+ from concurrent.futures import ThreadPoolExecutor
116
+
117
+ import time
118
+
119
+
120
+
121
+ def lambda_handler(devIdList):
122
+
123
+
124
+
125
+ tpe = ThreadPoolExecutor(max_workers=len(devIdList))
126
+
127
+ List = list()
128
+
129
+
130
+
131
+ for devId in devIdList:
132
+
133
+ future = tpe.submit(main, devId)
134
+
135
+ # submit直後にfuture.result()を呼び出しているため、futureが完了するまでループはブロックされる(このfutureが完了するまで次のsubmitがなされない)。
136
+
137
+ List.append(future.result())
138
+
139
+
140
+
141
+ tpe.shutdown()
142
+
143
+
144
+
145
+ return [i for i in List]
146
+
147
+
148
+
149
+
150
+
151
+ def main(devId):
152
+
153
+ print(f"main()が呼ばれました. 引数devIDは[{devId}]です。5秒間停止します。")
154
+
155
+ time.sleep(5)
156
+
157
+ print(f"main()から戻ります。 引数devID:[{devId}]")
158
+
159
+ return str(devId)+"_finished."
160
+
161
+
162
+
163
+
164
+
165
+ idlist = [10, 20, 30]
166
+
167
+ print(lambda_handler(idlist))
168
+
169
+ ```
170
+
171
+  
172
+
173
+  
174
+
175
+ 並行処理になる例
176
+
177
+ ```
178
+
179
+ from concurrent.futures import ThreadPoolExecutor, wait
180
+
181
+ import time
182
+
183
+
184
+
185
+ def lambda_handler(devIdList):
186
+
187
+
188
+
189
+ tpe = ThreadPoolExecutor(max_workers=len(devIdList))
190
+
191
+ List = list()
192
+
193
+
194
+
195
+ for devId in devIdList:
196
+
197
+ future = tpe.submit(main, devId)
198
+
199
+ # futureだけをリストに格納する。result()としていないので、すぐループして次のsubmitが起こる。
200
+
201
+ List.append(future)
202
+
203
+ wait(List) # List内のfutureが全部完了するまで待つ(実際はこのwaitの行がなくても、結果自体は変わらない)
204
+
205
+ tpe.shutdown()
206
+
207
+ # futureの結果をリストにして返す。
208
+
209
+ return [i.result() for i in List]
210
+
211
+
212
+
213
+ import random
214
+
215
+ def main(devId):
216
+
217
+ print(f"main()が呼ばれました. 引数devIDは[{devId}]です。5秒間停止します。")
218
+
219
+ time.sleep(5)
220
+
221
+ print(f"main()から戻ります。 引数devID:[{devId}]")
222
+
223
+ return str(devId)+"_finished."
224
+
225
+
226
+
227
+
228
+
229
+ idlist = [10,20,30]
230
+
231
+ print(lambda_handler(idlist))
232
+
233
+ ```