2012-10-24 6 views
6

Map_async() işlevini kullanırken geri aramalarıma çalışmam görünmüyor. Ben bunun yerine array_flowers() yoluyla görevleri eklemek için biraz değiştirilmiş kod kullandığımda çalışır. belgelerine ben map_async ile geri aramalar() kullanmak mümkün olmalıdır görünüyor ama çalıştırdığınızda belki onun newb çeşit hata ...Çok işlemcili Python geri arama.pools.map_async çalışmıyor?

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)) 

alıyorum:

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'] 

ı kullandığınızda apply_async() ile değiştirilmiş kod yerine, çıktıları geri aramalardan alırım. Bir şans aldı ve bunun için bir hata günlüğe

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

Ben senin çıkışını yeniden olamaz, bu "My geri arama [, 's3 yaptılar' 's2 yaptım' 's1 yaptım', 's4 vermedi' 's5 yaptım' fazladan bir satır sonucu benim makinede 's6' yazmış]. "Değiştirilmiş" kodunuzu gönderebilir misiniz? – del

+0

Hangi sürüm python? Pencerelerde 3.3 kullanıyorum. – Bbb

+0

Ayrıca çalışmamın kodunu eklemek için sorumu düzenledim. – Bbb

cevap

2

Tamam: içinde

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() 

Sonuçlar: Modifiye kod sadece son bölümünü değiştirmektir. Bu aslında 3.3 bir hata olduğunu ve bir yama devam ediyor. python 3.4.3 yılında

http://bugs.python.org/issue16307

1

, geri arama birikmiş sonuçlarla denir ama geri arama dönüş değeri dikkate alınmaz. Amaç ne?

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] 
İlgili konular