【问题标题】:Do I use async all the way down?我是否一直使用异步?
【发布时间】:2021-05-11 21:09:26
【问题描述】:

这里有一个玩具示例来说明我的问题:假设我有一个函数 get_all_foos() 多次调用 get_one_foo()。对 get_one_foo() 的每次调用都会调用 do_sql_query(),它实际上通过调用 await db_conn.fetch(<some sql>) 来检索一个 foo。

我的三个函数中的哪一个应该被标记为异步的?如果我将它们全部标记为异步,是否会增加开销?

我的心理模型是,使用 await 调用函数会增加某种调度开销,如果该函数本身不执行任何 IO,它只会调用最终执行 IO 的其他函数,则没有任何意义。但是我的心智模型仍然可能来自线程框架,而不是协程框架。

【问题讨论】:

  • 在异步程序中,大多数函数肯定应该被标记为异步。只有少数例外...

标签: python python-3.x python-asyncio


【解决方案1】:

摘要中问题的答案是“是” - 您确实需要一直异步。

我的心理模型是,使用 await 调用函数会增加某种调度开销,如果该函数本身不执行任何 IO,它只调用最终执行 IO 的其他函数,则没有任何意义。

幸运的是,这是不正确的。一个简单的await 不会(必然)进行任何调度——它甚至不会进入事件循环,除非等待的函数选择挂起。 await 立即开始执行等待者,并且不会比开始执行生成器(这是等待的实现方式)对性能造成更大的影响。

这有时甚至会成为一个问题,因为等待某事从不暂停的代码实际上以 blocking the event loop 结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2018-09-24
    • 2019-07-02
    • 2018-02-10
    • 2023-01-20
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多