2017-07-04 10 views
0

こんにちは私は自分のコードをスピードアップするためにマルチプロセッシングを使用しようとしています。しかし、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>' 
+0

は 'FUNC()'期待通りのファイルを作成していない、またはあなただけの任意の速度の利点を見ていないですか? –

+0

@JohnGordon 'func'は何もしません。私の最初の例のように' cube'は実行されません。 –

+0

あなたは、すべてのプロセスが同じグローバルな 't'を共有していると仮定しています。 't'が存在し、すべてのプロセスで共有されるように' t'をパラメータとして渡す必要があります。 –

答えて

0

EDIT:あなたが指定した最初の例は動作しません簡単な理由から、プロセスはメモリを共有しません。したがって、変更t[x] = x**3は親プロセスには適用されず、リストの値は変更されません。tは変更されません。

実際に計算から値を戻し、そこから新しいリストを作成する必要があります。

def cube(x): 
    return x**3 

t = [0, 1, 2, 3, 4, 5] 

p = Pool() 
t = p.map(cube, t) 

print(t) 

あなたは第二の例で主張するように、結果が返されるが、独立して、ファイル内に格納されていないと思われ、これは発生しません、私はあなたの関数の戻り値をチェックすることをお勧めしたい、場合関数自体が例外を発生させているかどうかを調べる。

私は、実際の結果を取得し、何が起こるかを見るためにあなたをお勧めします:

p = Pool() 
for i in lt: 
    res = p.apply_async(func, args=(i, b, c, d,)) 
    print(res.get()) # this will raise an exception if it happens within func 

p.close() # do not accept any more tasks 
p.join() # wait for the completion of all scheduled jobs 
+0

これは私のためには機能しません.. –

+0

答えを編集しました。 – noxdafox

+0

ご理解いただきありがとうございます。今私はエラーが発生しました、私の更新された質問をご覧ください。 –

-1

機能があまりにも早く終了し、で追加してみてくださいスクリプトの最後にこのコード:

import time 
time.sleep(3) 
関連する問題