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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:40:22