V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xhatt510
V2EX  ›  程序员

想问下大家平时用 Python 中 asyncio 库的时候,有什么技巧?或者说用了哪些 high level 或 low level 的 api?

  •  
  •   xhatt510 · 174 天前 · 1380 次点击
    这是一个创建于 174 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面我经常用的

    1. asyncio.run(coro) 运行顶层的协程,直到完成,适合简单的脚本和测试。
    2. asyncio.create_task(coro) 创建一个异步任务,用于并行执行协程。
    3. asyncio.gather(*coros, return_exceptions=False) 并行运行多个协程,收集它们的结果。
    4. asyncio.Lock 异步锁,用于同步访问共享资源。
    5. asyncio.Event 异步事件,用于在协程间通信。
    6. asyncio.Semaphore 和 asyncio.BoundedSemaphore 条件变量,允许协程等待某个条件成立。

    看看大家平时还用了什么 API ?获取能学到新东西

    6 条回复    2024-06-29 21:21:45 +08:00
    keakon
        1
    keakon  
       174 天前   ❤️ 2
    如果你除了结果,还关注状态或异常等信息,以及返回时机的控制,可以用 asyncio.wait 取代 asyncio.gather 。
    asyncio.to_thread 可以把同步调用转成异步。
    asyncio.Queue 可以实现并发控制,比如预先分配 10 个资源,那么只有 10 个协程能 get 资源,其他的会被阻塞,直到用完资源的协程把资源放回队列。
    zhuangzhuang1988
        2
    zhuangzhuang1988  
       174 天前   ❤️ 1
    官方文档过一遍全是技巧
    比如还有加入 debug 选项看调试
    结构化并发 TaskGroup
    Lihanx9
        3
    Lihanx9  
       174 天前   ❤️ 1
    以前用得多的时候,设计项目代码经常会参考 scrapy/twisted 😂
    感觉 asyncio/gevent/twisted 核心的 api 功能都差不多,毕竟系统层面的依赖都是一样的,所以经常去另外两个的项目里找灵感..
    xhatt510
        4
    xhatt510  
    OP
       174 天前
    @lihanx9 多谢。我也去看看
    nowheremanx
        5
    nowheremanx  
       173 天前
    不才,写过一个项目,感觉 python 下面 asyncio 的 api 很奇葩,搞不清楚,每次都要查文档才能写。

    明明都是 async ,写起来和 JS 感觉差好多。
    xhatt510
        6
    xhatt510  
    OP
       173 天前
    @nowheremanx 对啊 我也觉得
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:33 · PVG 21:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.