回答編集履歴

2

引用内で __main__ が表示されていなかったため、修正

2020/05/05 08:12

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -6,10 +6,14 @@
6
6
 
7
7
 
8
8
 
9
+ ```
10
+
9
11
  > このパッケージに含まれる機能を使用するためには、
10
12
 
11
13
  > 子プロセスから __main__ モジュールをインポートできる必要があります。
12
14
 
15
+ ```
16
+
13
17
 
14
18
 
15
19
  ----

1

不要なコードの削除

2020/05/05 08:12

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -78,13 +78,87 @@
78
78
 
79
79
  return result
80
80
 
81
+ """
82
+
83
+ exec(spam_class, spam_module.__dict__)
84
+
85
+ sys.modules['spam'] = spam_module
86
+
87
+
88
+
89
+ print("DynamicModule生成") #### XXX: <----- 確認用。計4回呼ばれます。
90
+
91
+
92
+
93
+ return spam_module
94
+
95
+
96
+
97
+ Param = 'Num1 * Num2'
98
+
99
+ # DynamicModule生成
100
+
101
+ dynamicModule(Param)
102
+
103
+ # DynamicModuleインポート
104
+
105
+ import spam
106
+
81
107
 
82
108
 
83
109
  if __name__ == "__main__":
84
110
 
111
+ from multiprocessing import Pool
112
+
113
+
114
+
115
+ # インプットパラメータ
116
+
117
+ multi_args = ([2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7])
118
+
119
+
120
+
121
+ # 並列処理
122
+
123
+ with Pool(3) as pool:
124
+
125
+ list_result = pool.starmap(spam.calculation, multi_args)
126
+
127
+ print(list_result)
128
+
129
+ ```
130
+
131
+
132
+
133
+ ----
134
+
135
+ ## 解決策3: initializerを指定する。
136
+
137
+
138
+
139
+ こちらは2回で済みます。
140
+
141
+
142
+
143
+ ```python
144
+
145
+ import types
146
+
147
+ import sys
148
+
149
+
150
+
151
+ def dynamicModule(Param):
152
+
153
+ spam_module = types.ModuleType('spam', 'dynamic generated module')
154
+
155
+ spam_class = """
156
+
85
- calculation(1, 2)
157
+ def calculation(Num1, Num2):
158
+
86
-
159
+ result = """ + Param + """
160
+
87
-
161
+ return result
88
162
 
89
163
  """
90
164
 
@@ -94,7 +168,7 @@
94
168
 
95
169
 
96
170
 
97
- print("DynamicModule生成") #### XXX: <----- 確認用。計4回呼ばれます
171
+ print("DynamicModule生成") #### XXX: <----- 確認用。計2回呼ばれます
98
172
 
99
173
 
100
174
 
@@ -102,16 +176,6 @@
102
176
 
103
177
 
104
178
 
105
- Param = 'Num1 * Num2'
106
-
107
- # DynamicModule生成
108
-
109
- dynamicModule(Param)
110
-
111
- # DynamicModuleインポート
112
-
113
- import spam
114
-
115
179
 
116
180
 
117
181
  if __name__ == "__main__":
@@ -126,96 +190,24 @@
126
190
 
127
191
 
128
192
 
193
+ Param = 'Num1 * Num2'
194
+
195
+ # DynamicModule生成
196
+
197
+ dynamicModule(Param)
198
+
199
+ # DynamicModuleインポート
200
+
201
+ import spam
202
+
203
+
204
+
129
205
  # 並列処理
130
206
 
131
- with Pool(3) as pool:
207
+ with Pool(3, dynamicModule, (Param,)) as pool:
132
208
 
133
209
  list_result = pool.starmap(spam.calculation, multi_args)
134
210
 
135
211
  print(list_result)
136
212
 
137
213
  ```
138
-
139
-
140
-
141
- ----
142
-
143
- ## 解決策3: initializerを指定する。
144
-
145
-
146
-
147
- こちらは2回で済みます。
148
-
149
-
150
-
151
- ```python
152
-
153
- import types
154
-
155
- import sys
156
-
157
-
158
-
159
- def dynamicModule(Param):
160
-
161
- spam_module = types.ModuleType('spam', 'dynamic generated module')
162
-
163
- spam_class = """
164
-
165
- def calculation(Num1, Num2):
166
-
167
- result = """ + Param + """
168
-
169
- return result
170
-
171
- """
172
-
173
- exec(spam_class, spam_module.__dict__)
174
-
175
- sys.modules['spam'] = spam_module
176
-
177
-
178
-
179
- print("DynamicModule生成") #### XXX: <----- 確認用。計2回呼ばれます
180
-
181
-
182
-
183
- return spam_module
184
-
185
-
186
-
187
-
188
-
189
- if __name__ == "__main__":
190
-
191
- from multiprocessing import Pool
192
-
193
-
194
-
195
- # インプットパラメータ
196
-
197
- multi_args = ([2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7])
198
-
199
-
200
-
201
- Param = 'Num1 * Num2'
202
-
203
- # DynamicModule生成
204
-
205
- dynamicModule(Param)
206
-
207
- # DynamicModuleインポート
208
-
209
- import spam
210
-
211
-
212
-
213
- # 並列処理
214
-
215
- with Pool(3, dynamicModule, (Param,)) as pool:
216
-
217
- list_result = pool.starmap(spam.calculation, multi_args)
218
-
219
- print(list_result)
220
-
221
- ```