回答編集履歴
2
引用内で __main__ が表示されていなかったため、修正
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
不要なコードの削除
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
|
-
|
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: <----- 確認用。計
|
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
|
-
```
|