为什么多处理调用的函数不打印消息?

2024-04-26 13:03:57 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么在下面的示例中,myFunct()不打印任何由“multiprocessing”运行的消息?如何解决呢?你知道吗

import multiprocessing as mp
poolDict=mp.Manager().dict()

def myFunct(arg):
    print 'myFunct():', arg
    for i in range(110):
        for n in range(500000):
            pass
        poolDict[arg]=i
    print 'myFunct(): completed', arg, poolDict


from multiprocessing import Pool
pool = Pool(processes=2)
myArgsList=['arg1','arg2','arg3']

pool.map_async( myFunct, myArgsList)
print 'completed'

Tags: inimport示例forargrangempmultiprocessing
2条回答

如果使用apply\u async()而不是map\u async(),并添加close()和join()调用,则效果良好:

import multiprocessing as mp
poolDict=mp.Manager().dict()

def myFunct(arg):
    print 'myFunct():', arg
    for i in range(110):
        for n in range(500000):
            pass
        poolDict[arg]=i
    print 'myFunct(): completed', arg, poolDict

from multiprocessing import Pool
pool = Pool(processes=2)
myArgsList=['arg1','arg2','arg3']

pool.apply_async( myFunct, myArgsList)
pool.close()
pool.join()
print 'completed'

结果:

myFunct(): arg1
myFunct(): arg2
myFunct(): completedmyFunct(): completed arg1 {'arg1': 109, 'arg2': 109}
 arg2 {'arg1': 108, 'arg2': 109}
myFunct(): arg3
myFunct(): completed arg3 {'arg1': 109, 'arg2': 109, 'arg3': 109}
completed

这不是打印,因为主进程在调用map_async后立即退出,所以没有任何子进程有机会实际运行。如果让脚本等待子脚本完成,则会按预期打印:

pool.map_async( myFunct, myArgsList)
pool.close()
pool.join()
print 'completed'

bash提示符的输出:

dan@dan:~> ./mult.py 
myFunct(): arg1
myFunct(): arg2
myFunct(): completed arg2 {'arg1': 108, 'arg2': 109}
myFunct(): arg3
myFunct(): completed arg1 {'arg1': 109, 'arg2': 109}
myFunct(): completed arg3 {'arg1': 109, 'arg2': 109, 'arg3': 109}
completed

相关问题 更多 >