6

使用map_async(). 当我使用稍微修改的代码来循环我的数组添加任务时,它会起作用apply_async()。从文档看来我应该能够使用回调map_async(),但也许这是某种新手错误......

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()我会从回调中获取打印输出。修改后的代码就是把最后一部分改成:

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

结果是:

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
4

1 回答 1

3

好的,我抓住了一个机会并为它记录了一个错误。原来它实际上是 3.3 中的一个错误,并且正在进行补丁。

http://bugs.python.org/issue16307

于 2012-10-24T22:14:49.313 回答