回答編集履歴
4
修正
answer
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
|
35
35
|
このように、呼び出される側(引数を受け取る側)は受け取り口を2つ用意しているのに、呼び出し側は1つしか引数を与えていません。
|
36
36
|
|
37
|
-
これは一
|
37
|
+
これは引数の数が不一致のため**TypeErrorという例外**を発生させる事象となります。
|
38
38
|
|
39
39
|
|
40
40
|
2.multiprocessingの子プロセスの実行時例外
|
@@ -138,7 +138,7 @@
|
|
138
138
|
逆に1.冒頭の後半のパターンで無理やり例外を生じさせないようにするなら、下記のようなコードになるでしょう。
|
139
139
|
|
140
140
|
```diff
|
141
|
-
def long_time_task(
|
141
|
+
def long_time_task(self, name): # selfの代わりにfooなど別の名前を使っても同じ。
|
142
142
|
print('Run task {} ({})...'.format(name, os.getpid()))
|
143
143
|
start = time.time()
|
144
144
|
time.sleep(3)
|
@@ -165,11 +165,11 @@
|
|
165
165
|
|
166
166
|
```
|
167
167
|
|
168
|
-
変えたのは、
|
168
|
+
変えたのは、
|
169
169
|
|
170
170
|
```diff
|
171
171
|
+ res = p.apply_async(long_time_task, args=(None,i+1))
|
172
172
|
```
|
173
173
|
の部分です。
|
174
174
|
|
175
|
-
受け取り側が
|
175
|
+
受け取り側が`self, name` の2つなのですから、呼び出し側を1つの要素から2つの要素をもったタブルに変え、さらに`name`は2番目なので、**2番目のパラメータに`i+1`を渡す**ようにします。
|
3
answer
CHANGED
@@ -80,7 +80,7 @@
|
|
80
80
|
全部子プロセスが終了した後、resultsの中の結果のget()を呼び出しています。
|
81
81
|
|
82
82
|
通常、このget()は、それぞれの子プロセスが走らせた関数の結果を返すために使うものですが、
|
83
|
-
子プロセス実行中に例外が発生していた場合は、get()の段階でその例外が送出され、親プロセスも止まり
|
83
|
+
子プロセス実行中に例外が発生していた場合は、get()の段階でその例外が送出され、親プロセスも止まります。
|
84
84
|
|
85
85
|
|
86
86
|
上記後段のコードにあてはめると、
|
2
answer
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
|
50
50
|
3.例外を捕捉するには
|
51
|
-
では、子の中でどんな例外がおきたか、どうやって
|
51
|
+
では、子の中でどんな例外がおきたか、どうやって捕捉すればいいのでしょうか。
|
52
52
|
|
53
53
|
Pool.apply_async() が返す結果のクラスである、[`AsyncResult`](https://docs.python.org/ja/3/library/multiprocessing.html#multiprocessing.pool.AsyncResult)に[get()](https://docs.python.org/ja/3/library/multiprocessing.html#multiprocessing.pool.AsyncResult.get)という関数があり、これを利用**することができます**。
|
54
54
|
|
1
修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
...
|
15
15
|
...
|
16
16
|
> ```
|
17
|
-
とすると、なぜスルーされるのか
|
17
|
+
とすると、なぜスルーされるのか?
|
18
18
|
|
19
19
|
|
20
20
|
回答:
|
@@ -122,11 +122,11 @@
|
|
122
122
|
> また関数にselfを使う際にはどうすればスルーされずに実行できるのか教えてください。
|
123
123
|
|
124
124
|
selfを使う、というのは、多分クラスのところでご覧になったのだと思いますが、今回の件は、クラスで使うselfとは**無関係**です。
|
125
|
-
単純に「1つ
|
125
|
+
単純に「1つだけ書くべきパラメータを2つにしてしまった」ことが原因で発生した事象に過ぎません。
|
126
126
|
selfではなく、例えば別の名前の変数を使っても、数が多すぎたり少なすぎたりするだけで、同じような事象になります。
|
127
127
|
|
128
128
|
```
|
129
|
-
def long_time_task(foo, name): # 別の名前、数が多い
|
129
|
+
def long_time_task(foo, name): # selfではない別の名前、数が多い(2個)
|
130
130
|
|
131
131
|
def long_time_task(baz, yoo, name): # 数がさらに多い(3個)
|
132
132
|
|
@@ -135,8 +135,7 @@
|
|
135
135
|
```
|
136
136
|
|
137
137
|
|
138
|
-
逆に後半のパターンで無理やり例外を生じさせないようにするなら、
|
138
|
+
逆に1.冒頭の後半のパターンで無理やり例外を生じさせないようにするなら、下記のようなコードになるでしょう。
|
139
|
-
下記のようなコードになるでしょう。
|
140
139
|
|
141
140
|
```diff
|
142
141
|
def long_time_task(foo, name): # selfの代わりにfooを使っている。selfでも同じ
|
@@ -167,10 +166,10 @@
|
|
167
166
|
```
|
168
167
|
|
169
168
|
変えたのは、緑色で強調したように
|
170
|
-
``diff
|
171
169
|
|
170
|
+
```diff
|
172
171
|
+ res = p.apply_async(long_time_task, args=(None,i+1))
|
173
172
|
```
|
174
173
|
の部分です。
|
175
174
|
|
176
|
-
受け取り側がfoo, name の2つなのですから、呼び出し側を1つの要素から2つの要素をもったタブルに変え、さらにnameは2番目なので2番目に適切にi+1を渡すようにしています。
|
175
|
+
受け取り側がfoo, name の2つなのですから、呼び出し側を1つの要素から2つの要素をもったタブルに変え、さらにnameは2番目なので、**2番目のパラメータに適切にi+1を渡す**ようにしています。
|