Python中如何并行调用多个库/函数,全部完成后再执行后续步骤?
问题解答
可行性说明
该需求完全可以实现,核心是实现多个并行任务的屏障同步,即所有任务执行完成后再触发后续逻辑,完全适配你多数据集并行加载的场景。
技术选型标准
- 若你的数据加载环节以IO操作为主(如网络下载、磁盘读取,CPU运算占比<10%):优先选择async方案,资源开销更小,并发调度效率更高;也可以直接用多线程方案,改造成本更低。
- 若你的数据加载环节包含大量CPU密集运算(如大数据集解码、格式转换、实时清洗):优先选择multiprocessing多进程方案,规避Python GIL锁对CPU算力的限制。
实现示例
async方案(IO密集场景首选)
import asyncio import aiohttp import aiofiles # 替换为你自己的数据集加载逻辑,支持完全不同的任务实现 async def load_dataset_1(): async with aiohttp.ClientSession() as session: async with session.get("数据集1下载地址") as resp: return await resp.content.read() async def load_dataset_2(): async with aiofiles.open("本地数据集2路径", "rb") as f: return await f.read() # 更多数据集加载函数可自行定义... async def main(): # 批量启动所有并行任务,等待全部完成后按顺序返回结果 var1, var2 = await asyncio.gather( load_dataset_1(), load_dataset_2() # 追加更多数据集加载任务即可 ) # 所有任务完成后再执行后续逻辑 var3 = var1 + var2 # 后续业务逻辑... if __name__ == "__main__": asyncio.run(main())
多进程方案(CPU密集场景首选)
from concurrent.futures import ProcessPoolExecutor, wait import requests # 替换为你自己的数据集加载逻辑,支持完全不同的任务实现 def load_dataset_1(): resp = requests.get("数据集1下载地址") # 可添加CPU密集型预处理逻辑 return resp.content def load_dataset_2(): with open("本地数据集2路径", "rb") as f: data = f.read() # 可添加CPU密集型预处理逻辑 return data # 更多数据集加载函数可自行定义... if __name__ == "__main__": with ProcessPoolExecutor() as executor: # 提交所有并行任务 tasks = [ executor.submit(load_dataset_1), executor.submit(load_dataset_2) # 追加更多数据集加载任务即可 ] # 等待所有任务执行完成 wait(tasks) # 按顺序获取任务结果 var1, var2 = [task.result() for task in tasks] # 所有任务完成后再执行后续逻辑 var3 = var1 + var2 # 后续业务逻辑...
补充说明
如果是纯IO场景不想改造异步代码,只需要把多进程示例中的ProcessPoolExecutor替换为ThreadPoolExecutor,不需要修改其他代码即可获得和async接近的性能,改造成本最低。
内容的提问来源于stack exchange,提问作者Lostsoul
相关产品推荐
相关产品推荐

