gpt4 book ai didi

python - 多处理时不调用回调

转载 作者:太空狗 更新时间:2023-10-30 01:06:54 25 4
gpt4 key购买 nike

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

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' 语句似乎以某种方式被忽略了。也许上面的“回调”或“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 应该阻塞直到进程终止,但这里不是这种情况。

最佳答案

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

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

关于python - 多处理时不调用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34518077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com