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
私はそれが余分なライン「マイコールバックを出力し、私のマシン上で、あなたの出力を再現することはできません[、、、、 『S4んでした』 『S3んでした』 『S2でした』 『S1んでした』 『S5ました』 、 'did s6']」あなたはあなたの "変更された"コードを投稿できますか? – del
どのバージョンのpythonですか?私はWindows上で3.3を使用しています。 – Bbb
私は私の質問を編集して、動作したコードを追加しました。 – Bbb