如何并行运行两个带不同参数的异步函数并收集返回结果?
实现多函数并行运行并收集结果
针对你的需求,这里提供两种常用的实现方式,都能让不同函数带不同参数并行执行,最后统一收集结果:
方法1:使用线程池(ThreadPoolExecutor)
适合IO密集型任务(比如你的代码里有time.sleep),不需要大幅修改原有函数:
import time from concurrent.futures import ThreadPoolExecutor def func1(x,y): print("run func1") if x == 1: res1=x+y else: res1=x-y time.sleep(2) return res1 def func2(text): print("run fun2") if text=="hello": res2=True else: res2=False time.sleep(1) return res2 def parallel(): with ThreadPoolExecutor() as executor: # 提交两个不同任务,每个任务绑定对应函数和参数 future1 = executor.submit(func1, x=2, y=4) future2 = executor.submit(func2, text="hello") # 等待任务完成并获取结果 res1 = future1.result() res2 = future2.result() return res1, res2 res1,res2=parallel() print(res1) print(res2)
关键说明:
executor.submit()用于提交单个任务,第一个参数是目标函数,后面跟位置参数或关键字参数future.result()会阻塞当前线程,直到对应任务完成并返回结果with语句会自动管理线程池的创建和销毁,无需手动关闭
方法2:使用异步IO(asyncio)
适合原生异步场景,需要将普通函数改为异步函数:
import asyncio async def func1(x,y): print("run func1") if x == 1: res1=x+y else: res1=x-y await asyncio.sleep(2) # 替换time.sleep为异步睡眠 return res1 async def func2(text): print("run fun2") if text=="hello": res2=True else: res2=False await asyncio.sleep(1) return res2 async def parallel(): # 创建异步任务 task1 = asyncio.create_task(func1(x=2, y=4)) task2 = asyncio.create_task(func2(text="hello")) # 等待所有任务完成,按顺序返回结果 res1, res2 = await asyncio.gather(task1, task2) return res1, res2 if __name__ == "__main__": res1, res2 = asyncio.run(parallel()) print(res1) print(res2)
关键说明:
- 函数前加
async关键字定义异步函数,内部的阻塞操作(比如sleep)要替换为异步版本(await asyncio.sleep()) asyncio.create_task()将异步函数包装为可调度的任务asyncio.gather()会同时运行所有传入的任务,等待全部完成后返回结果列表,顺序和传入任务的顺序一致
内容的提问来源于stack exchange,提问作者yasharov
相关产品推荐
相关产品推荐

