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

使用Python multiprocessing做并行时进程串行运行而非并发如何解决

问题原因

你使用的Pool.apply()是同步阻塞接口,每次调用后会直接等待对应任务执行完成、返回结果后,才会执行下一次迭代的任务提交逻辑,相当于主动将并行任务转为串行执行,该问题和进程池配置、系统启动上下文、操作系统环境均无关。
如果你之前测试异步的apply_async接口依旧出现串行现象,大概率是你在提交每个异步任务后立即调用了get()方法等待结果,同样会阻塞任务提交流程,导致串行执行。

解决方案

核心逻辑是先一次性将所有任务提交到进程池,再统一等待执行结果,以下是两种可行实现:

方案1:使用apply_async异步提交

import multiprocessing as mp
import numpy as np
from fs import f

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    p = ctx.Pool(4)
    with p:
        subsets = [[0, 3], [3, 6], [6, 7]]
        # 第一步:异步提交所有任务,不阻塞,任务会在进程池内并发执行
        tasks = [p.apply_async(f, (subset, )) for subset in subsets]
        # 第二步:统一等待所有任务完成,按顺序获取结果
        res = [task.get() for task in tasks]
        print(res)

    print('Done!')

方案2:使用map更简洁实现

Pool.map()接口会自动完成批量提交任务、并行执行、统一返回结果的逻辑,写法更简洁:

import multiprocessing as mp
import numpy as np
from fs import f

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    p = ctx.Pool(4)
    with p:
        subsets = [[0, 3], [3, 6], [6, 7]]
        res = p.map(f, subsets)
        print(res)

    print('Done!')

两种方案修改后,程序总耗时都会接近10秒,符合预期的并行执行效果。

内容的提问来源于stack exchange,提问作者unkown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:18:03