V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
itskingname
V2EX  ›  问与答

如何快速把 Python 同步代码中的网络请求部分替换成异步代码

  •  
  •   itskingname · Oct 24, 2019 · 1443 views
    This topic created in 2380 days ago, the information mentioned may be changed or developed.

    我有一个 ETL 程序,将会按顺序实现如下功能:

    1. 从数据源读取数据
    2. 对数据进行脱敏
    3. 对数据进行清洗
    4. 分析每一条数据的情感
    5. 数据存入中间表

    其中,第 4 步是使用 requests 来发送 post 请求到一个 NLP 分析接口实现的。现在由于数据量增加,第 4 步的网络请求成为了瓶颈,因此希望把第 4 步改成 aiohttp.

    但是,由于 aiohttp 需要使用 async/await, 如果从 0 开始的话,要加入事件循环,每个相关的函数也要改为 async def 来定义,而且也难以使用 class。

    单独从 0 开始使用 async/await 重写这个 ETL 程序当然没有问题,但是有没有办法以最小的代码修改量替换第 4 步操作?最好能实现 1235 步的代码都不需要改动。

    7 replies    2019-10-24 12:34:26 +08:00
    shoaly
        1
    shoaly  
       Oct 24, 2019
    换个思路, 第四步用队列去完成
    ClericPy
        2
    ClericPy  
       Oct 24, 2019
    以前学习的时候实现过同步代码里使用协程

    from torequests.dummy import Requests
    req = Requests(frequencies={'p.3.cn': (2, 2)})
    tasks = [
    req.get(
    'http://p.3.cn',
    retry=1,
    timeout=5,
    callback=lambda x: (len(x.content), print(req.frequencies, flush=1)))
    for i in range(4)
    ]
    req.x # or [task.x for task in tasks]
    result = [task.cx for task in tasks]
    print(result)


    这里的 cx 是 callback 的返回结果, 如果没有 callback, 直接使用 task.x 就有了, 和普通协程比, 性能损失倒也不算大. 不过还是习惯在全局协程里用
    locoz
        3
    locoz  
       Oct 24, 2019
    加入中间件,将第四部拆出来放到另一个程序中处理
    Trim21
        4
    Trim21  
       Oct 24, 2019 via iPhone
    只在第四步里开一个事件循环,并发请求

    可以考虑一下 httpx,跟 requests 是 api 兼容的,
    Trim21
        5
    Trim21  
       Oct 24, 2019 via iPhone
    @Trim21 虽然还没完全稳定下来,不过自带一个并行请求的功能(底层还是 asyncio )

    https://www.encode.io/httpx/parallel/
    itskingname
        6
    itskingname  
    OP
       Oct 24, 2019
    @Trim21 我看一看,感谢
    itskingname
        7
    itskingname  
    OP
       Oct 24, 2019
    @locoz 最后没有更好的办法时,确实会使用这个办法。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2481 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 15:42 · PVG 23:42 · LAX 08:42 · JFK 11:42
    ♥ Do have faith in what you're doing.