多处理时不调用回调
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
添加到未明确定义的字符串中。您需要将整数转换为字符串才能进行字符串连接。
我花了一整天的时间来调试下面的代码。它是关于多处理的。请看一下。
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
添加到未明确定义的字符串中。您需要将整数转换为字符串才能进行字符串连接。