我花了一整天的时间调试以下代码,它与多进程有关。请看一下。
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”。让我感到奇怪的是,当主程序停止时(没有任何“hello”的打印输出),printHello尚未完成;似乎“pool.join”语句被忽略了。也许上面的“callback”或“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。
[编辑2]我刚刚添加了'import time'。症状仍然存在:pool.join应该阻塞直到进程终止,但在这里并非如此。
time.sleep(2)
语句会有什么影响吗? - user1245262