You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:25:27