我花了一整天来调试下面的代码。它是关于多处理的。请看一下。
import numpy as np
import multiprocessing as mp
def printHello(x):
print "ENTERING: printHello"
time.sleep(2)
print "QUITTING: printHello"
return 'hello '+x
def log_result(result):
print "ENTERING: log_result"
time.sleep(2)
print "QUITTING: log_result"
def main_multi():
pool = mp.Pool()
for i in range(3):
pool.apply_async(printHello, args=(i, ), callback=log_result)
pool.close()
pool.join()
if __name__=='__main__':
print "ENTERING __main__"
main_multi()
print "QUITTING __main__"
我以为我会得到 输出行中有“QUITTING:printHello”,“ENTERING:log_result”和“QUITTING:printHello”。对我来说很奇怪的是,当主程序停止时,printHello还没有完成(没有'你好'打印出来); 'pool.join'语句似乎在某种程度上被忽略了。也许上面的'回调'或'apply_async'不能像我预期的那样工作。有什么想法吗?
我的控制台的输出是:
ENTERING __main__
ENTERING: printHello
ENTERING: printHello
ENTERING: printHello
QUITTING __main__
[编辑]有趣的是,如果我删除'time.sleep(2)'部分,我会
ENTERING __main__
ENTERING: printHello
QUITTING: printHello
ENTERING: printHello
QUITTING: printHello
ENTERING: printHello
QUITTING: printHello
QUITTING __main__
但这仍然无法解决所有问题。因为'helloPrint'中的'hello'没有打印出来,而我在apply_async之后确实有一个pool.join。
[Edit2]我只是添加'导入时间'。症状仍然存在:pool.join应该阻塞,直到进程终止,但这不是这种情况。
答案 0 :(得分:4)
您尚未导入time
模块,因此您对time.sleep
的调用会导致工作进程出错。这就是为什么你没有得到"QUITTING"
消息,也没有调用回调。
如果您解决了这个问题,当您尝试生成返回值时,您仍会在工作程序中遇到错误。您将要传递的整数x
添加到字符串"hello"
,该字符串未明确定义。您需要将整数转换为字符串,以使字符串连接起作用。