こんにちは私は自分のコードをスピードアップするためにマルチプロセッシングを使用しようとしています。しかし、apply_asyncは私のためには機能しません。私は次のような簡単な例を試してみました:t
のような単純な例を試してみました。実際にはt
は変わりません。Python - apply_asyncは関数を実行しません
from multiprocessing.pool import Pool
def func(a, b, c, d):
#some calculations
#save result to files
#no return value
lt = #list of possible value of a
#set values to b, c, d
p = Pool()
for i in lt:
p.apply_async(func, args=(i, b, c, d,))
:
私の実際のコードは次のようにありますか?
ありがとうございました!
更新:コメントと回答のおかげで、私の簡単な例がうまくいかない理由がわかりました。しかし、私はまだ私の実際のコードに問題があります。 func
がグローバル変数に依存していないことを確認しましたので、私のサンプルコードと同じ問題ではないようです。
示唆したように、私は今、私のコードは、私のfunc
に戻り値を追加:
f = Flux("reactor")
d = Detector("Ge")
mv = arange(-6, 1.5, 0.5)
p = Pool()
lt = ["uee", "dee"]
for i in lt:
re = p.apply_async(res, args=(i, d, f, mv,))
print(re.get())
p.close()
p.join()
今、私は次のエラーを取得する:
Traceback (most recent call last):
File "/Users/Shu/Documents/Programming/Python/Research/debug.py", line 35, in <module>
print(re.get())
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/pool.py", line 608, in get
raise self._value
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/pool.py", line 385, in _handle_tasks
put(task)
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
AttributeError: Can't pickle local object 'Flux.__init__.<locals>.<lambda>'
は 'FUNC()'期待通りのファイルを作成していない、またはあなただけの任意の速度の利点を見ていないですか? –
@JohnGordon 'func'は何もしません。私の最初の例のように' cube'は実行されません。 –
あなたは、すべてのプロセスが同じグローバルな 't'を共有していると仮定しています。 't'が存在し、すべてのプロセスで共有されるように' t'をパラメータとして渡す必要があります。 –