多处理时,回调不会调用

时间:2015-12-29 19:51:49

标签: python asynchronous multiprocessing

我花了一整天来调试下面的代码。它是关于多处理的。请看一下。

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应该阻塞,直到进程终止,但这不是这种情况。

1 个答案:

答案 0 :(得分:4)

您尚未导入time模块,因此您对time.sleep的调用会导致工作进程出错。这就是为什么你没有得到"QUITTING"消息,也没有调用回调。

如果您解决了这个问题,当您尝试生成返回值时,您仍会在工作程序中遇到错误。您将要传递的整数x添加到字符串"hello",该字符串未明确定义。您需要将整数转换为字符串,以使字符串连接起作用。