如何修改Python代码实现10个任务异步并行执行
异步并发修改方案
原代码无法实现并发的核心问题:
- 循环中每次调用
asyncio.run(startTask(task))会阻塞当前线程,必须等单个任务完成后才处理下一个,导致串行执行。 - 同步库
requests会阻塞事件循环,即使使用async语法也无法真正实现并发。
以下是完整修改方案:
1. 依赖替换
安装异步HTTP库aiohttp(替代同步的requests):
pip install aiohttp
2. 完整修改代码
import aiohttp from bs4 import BeautifulSoup import asyncio # 异步实现获取产品逻辑 async def getProduct(session, task): try: async with session.get(task) as response: if response.status != 200: return None html = await response.text() soup = BeautifulSoup(html, 'html.parser') # 此处添加产品解析逻辑,返回True表示成功 return True except Exception as e: print(f"链接{task}获取产品失败: {str(e)}") return None # 异步实现加入购物车逻辑 async def addToCart(session, task): try: # 根据实际需求构造POST请求参数 async with session.post(f"{task}/add-cart") as response: if response.status != 200: return None # 此处添加加入购物车的结果校验逻辑,返回True表示成功 return True except Exception as e: print(f"链接{task}加入购物车失败: {str(e)}") return None async def startTask(session, task): # 替换递归重试为循环,避免栈溢出 while True: success = await getProduct(session, task) if success is not None: break await asyncio.sleep(1) # 失败后等待1秒再重试 while True: success = await addToCart(session, task) if success is not None: break await asyncio.sleep(1) # 后续其他任务步骤... async def runAllTasks(tasks): # 复用ClientSession提升并发性能 async with aiohttp.ClientSession() as session: # 创建所有异步任务 task_list = [startTask(session, task) for task in tasks] # 并发执行所有任务,等待全部完成 await asyncio.gather(*task_list) # 假设tasks是从CSV读取的10个链接列表 # tasks = ["https://example.com/product1", "https://example.com/product2", ...] asyncio.run(runAllTasks(tasks))
关键修改说明
- 并发执行逻辑:通过
asyncio.gather一次性提交所有任务到事件循环,实现多任务同时运行。 - 异步IO:使用
aiohttp替代requests,确保HTTP请求不会阻塞事件循环,真正实现异步并发。 - 重试优化:将递归重试改为循环+
asyncio.sleep,避免递归深度过大导致栈溢出,同时降低重试频率。 - 连接复用:使用
aiohttp.ClientSession复用TCP连接,提升并发请求的性能和稳定性。
内容的提问来源于stack exchange,提问作者Sean Berrie
相关产品推荐
相关产品推荐

