Tulip/asyncIO:为什么不是所有的调用都是异步的,并指明何时应该同步?

Gab*_*iel 10 python asynchronous python-3.x python-asyncio

当Guido 谈到 Tulip时,我参加了SF Python聚会,Tulip是Python中异步操作的未来asyncIO库.

该带走的是,如果你想要的东西被异步运行,你可以使用"yield from" + expression和几个装饰的指定后随之而来的通话yield from应该异步执行.关于它的好处是你可以正常读取该函数中的语句(就好像它是同步的),并且它的行为就好像它在执行该函数时是同步的(返回值和错误/异常传播和处理) ).

我的问题是:为什么没有相反的行为,即默认情况下所有函数调用都是异步的(并且没有yield from),并且当你想同步执行某些东西时,它们有不同的显式语法?

(除了需要另一个关键字/语法规范)

int*_*tgr 16

真正的答案是,Guido 喜欢异步屈服点在协同程序中是明确的这一事实,因为如果你没有意识到调用可以产生,那么这就是对并发问题的邀请 - 就像线程一样.但是如果你必须编写一个显式的yield from,那么很容易确保它不会落入两个关键操作的中间,这两个关键操作应该对其余代码来说是原子的.

正如他在PyCon 2013主题演讲中提到的,还有其他Python异步框架,如Gevent,默认情况下是异步的,他不喜欢这种方法.(11:58):

不幸的是,你仍然没有完全清楚调度程序可能在一个随机的时刻中断你的任务并切换到另一个任务的问题.[...]您今天调用的任何函数,您碰巧知道它永远不会切换,明天有人可以添加日志语句或延迟缓存或咨询设置文件.[...]


Tim*_*ers 11

请注意,可能的用途yield fromasynch PEP的一小部分,永远不需要使用.也许Guido在谈话中超卖了他们;-)

至于为什么函数没有被改变为默认情况下总是异步,这只是现实主义.Asynch噱头带来了新的开销和语义复杂性,而Python不会让每个人的生活变得缓慢和复杂化,使一些应用程序更容易编写.

简而言之,"实用性胜过纯洁";-)