使用concurrent futures时返回值先打印的问题排查与解决
问题:多进程中返回值先于函数内打印内容输出
不知为何,以下函数的返回值会先被打印出来:
def do_something(t): print(f'Sleeping for {t} second(s)...') time.sleep(t) return 'Done Sleeping...' if __name__ == '__main__': with concurrent.futures.ProcessPoolExecutor() as executor: secs = [5,4,3,2,1] results = [executor.submit(do_something, sec) for sec in secs] for f in concurrent.futures.as_completed(results): print(f.result())
我原本以为,就算用as_completed(),返回值也该在函数执行完成后才打印。这段代码还是来自一个YouTube视频,视频里运行完全正常。
补充说明
我预期的输出应该是:
Sleeping for 1 second(s)... Sleeping for 2 second(s)... Sleeping for 3 second(s)... Sleeping for 4 second(s)... Sleeping for 5 second(s)... Done Sleeping... Done Sleeping... Done Sleeping... Done Sleeping... Done Sleeping...
但实际得到的输出却是反过来的:
Done Sleeping... Done Sleeping... Done Sleeping... Done Sleeping... Done Sleeping... Sleeping for 1 second(s)... Sleeping for 2 second(s)... Sleeping for 3 second(s)... Sleeping for 4 second(s)... Sleeping for 5 second(s)...
返回值确实是按完成顺序打印的,但Done Sleeping会先全部输出,之后才显示函数内的打印内容。
问题解决
重写代码后找到了错误,修正后的代码如下:
from multiprocessing import * import time import concurrent.futures def worker(t): print(f'Sleeping for {t} second(s)...') time.sleep(t) return 'Done sleeping' if __name__ == '__main__': secs = [5,4,3,2,1] with concurrent.futures.ProcessPoolExecutor() as executor: processes = [executor.submit(worker, sec) for sec in secs] for x in processes: # 注意:这个for循环不能缩进在Process Pool Executor的with代码块内 print(x.result())
错误原因很简单:我把打印结果的for循环错误地缩进在了with ...:代码块内部。
内容的提问来源于stack exchange,提问作者Deltag0ny
相关产品推荐
相关产品推荐

