多处理时不调用回调

The callback does not call when 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 尚未完成(没有 'hello' 打印出来); '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

[Edit2] 我只是添加了 'import time'。症状仍然存在:pool.join 应该阻塞直到进程终止,但这里不是这种情况。

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

如果您解决了该问题,当您尝试生成 return 值时,您仍然会在 worker 中遇到错误。您将传递给字符串 "hello" 的整数 x 添加到未明确定义的字符串中。您需要将整数转换为字符串才能进行字符串连接。