multiprocess.apply_async
との両方を取り入れよ*args
うとしてい**kwargs
ます。ドキュメントは、これが呼び出しシーケンスで可能である可能性があることを示しています:
apply_async(func[, args[, kwds[, callback]]])
しかし、呼び出し構文を正しくする方法がわかりません。最小限の例では:
from multiprocessing import Pool
def f(x, *args, **kwargs):
print x, args, kwargs
args, kw = (), {}
print "# Normal call"
f(0, *args, **kw)
print "# Multicall"
P = Pool()
sol = [P.apply_async(f, (x,), *args, **kw) for x in range(2)]
P.close()
P.join()
for s in sol: s.get()
これは期待どおりに機能し、出力が得られます
# Normal call
0 () {}
# Multicall
0 () {}
1 () {}
args が空のタプルではない場合、たとえばargs = (1,2,3)
、単一の呼び出しは機能しますが、マルチプロセッシング ソリューションは次のようになります。
# Normal call
0 (1, 2, 3) {}
# Multicall
Traceback (most recent call last):
File "kw.py", line 16, in <module>
sol = [P.apply_async(f, (x,), *args, **kw) for x in range(2)]
TypeError: apply_async() takes at most 5 arguments (6 given)
たとえば、kwargs引数を使用すると、kw = {'cat':'dog'}
# Normal call
0 () {'cat': 'dog'}
# Multicall
Traceback (most recent call last):
File "kw.py", line 15, in <module>
sol = [P.apply_async(f, (x,), *args, **kw) for x in range(2)]
TypeError: apply_async() got an unexpected keyword argument 'cat'
どうすれば適切にラップできmultiprocess.apply_async
ますか?