我是否一直使用异步?

Do I use async all the way down?

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

来检索一个 foo

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

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

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

My mental model is that calling a function with await adds some sort of scheduling overhead, and doesn't make sense if that function doesn't do any IO itself, it only calls other functions that eventually do IO.

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

这有时甚至会成为一个问题,因为等待永不挂起的代码实际上最终会