2012-10-24 8 views
6

map_async()を使用しているときにコールバックが機能しないようです。これは、若干修正されたコードを使用して配列をループし、apply_async()を介してタスクを追加するときに機能します。私が(map_asyncでコールバックを使用することができるはずと思われる文書から)多分初心者くさい間違いのそのいくつかの種類...multiprocessing.pools.map_asyncが動作していないPythonコールバック?

from multiprocessing import Pool,TimeoutError 
from time import sleep 

servers=["s1","s2","s3","s4","s5","s6"] 

def f(x): 
    print("start f(" + x + ")") 
    sleep(5) 
    print("end f(" + x + ")") 
    return "did " + x 

def mycallback(x): 
    print("My callback " + str(x)) 

def myerrorcallback(r): 
    print("My errorcallback " + str(r)) 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    results = pool.map_async(f, servers, chunksize=1, callback=mycallback, error_callback=myerrorcallback) 
    print(results.get(timeout=11)) 

実行すると、私が取得:

D:\python> f.py 
start f(s1) 
start f(s2) 
start f(s3) 
start f(s4) 
end f(s1) 
start f(s5) 
end f(s2) 
start f(s6) 
end f(s4) 
end f(s3) 
end f(s5) 
end f(s6) 
['did s1', 'did s2', 'did s3', 'did s4', 'did s5', 'did s6'] 

私が使用している場合代わりにapply_async()を使ってコードを修正しました。私は、コールバックからプリント出力を取得します。私はチャンスを取り、それのためにバグを記録し

D:\python\>fb.py 
start f(s1) 
start f(s2) 
start f(s3) 
start f(s4) 
end f(s1) 
start f(s5) 
My callback did s1 
end f(s2) 
My callback did s2 
start f(s6) 
end f(s3) 
My callback did s3 
end f(s4) 
My callback did s4 
end f(s5) 
My callback did s5 
end f(s6) 
My callback did s6 
+0

私はそれが余分なライン「マイコールバックを出力し、私のマシン上で、あなたの出力を再現することはできません[、、、、 『S4んでした』 『S3んでした』 『S2でした』 『S1んでした』 『S5ました』 、 'did s6']」あなたはあなたの "変更された"コードを投稿できますか? – del

+0

どのバージョンのpythonですか?私はWindows上で3.3を使用しています。 – Bbb

+0

私は私の質問を編集して、動作したコードを追加しました。 – Bbb

答えて

2

OK:中

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    for server in servers: 
     pool.apply_async(f, (server,), callback=mycallback, error_callback=myerrorcallback) 
    pool.close() 
    pool.join() 

結果:変更されたコードだけに最後の部分を変更することです。実際には3.3のバグであり、パッチが進行中であることが分かります。 python 3.4.3

http://bugs.python.org/issue16307

1

、コールバックが蓄積した結果で呼び出されますが、コールバックの戻り値は無視されます。ポイントは何ですか?

from multiprocessing import Pool 

data = [1, 2, 3] 

def calc(x): 
    return 2*x 

def increment(results): 
    print('callback called') 
    return [x+100 for x in results] 

with Pool(None) as pool: #None => calls cpu.count() 
    results = pool.map_async(calc, data, callback=increment) 
    print(results.get()) 

--output:-- 
callback called 
[2, 4, 6] 
関連する問題