当Guido talked关于Tulip时,我参加了SF Python聚会,Tulip是Python中异步操作的未来asyncIO库。
需要注意的是,如果你想要异步运行某些东西,你可以使用"yield from" + expression
和几个装饰器来指定对yield from
之后的内容的调用应该异步执行。关于它的好处是你可以正常读取该函数中的语句(就好像它是同步的),并且它的行为就好像它在执行该函数时是同步的(返回值和错误/异常传播和处理) )。
我的问题是:为什么没有相反的行为,即默认情况下所有函数调用都是异步的(并且没有yield from
),并且当你想同步执行某些东西时有不同的显式语法?
(除了需要另一个关键字/语法规范)
答案 0 :(得分:15)
真正的答案是,Guido 喜欢异步屈服点在协同程序中是明确的这一事实,因为如果你没有意识到调用可以产生,那么这就是对并发问题的邀请 - 喜欢线程。但是如果你必须写一个明确的yield from
,那么很容易确保它不会落在两个关键操作的中间,这两个关键操作对于其余的代码来说应该是原子的。
正如他提到in his PyCon 2013 keynote,还有其他Python异步框架,如Gevent,默认情况下是异步的,他不喜欢这种方法。 (11:58):
不幸的是,你还没有完全清楚这个问题 调度程序可以在一个随机的时刻中断你的任务和 切换到另一个。 [...]今天你称之为的任何功能 你碰巧知道它永远不会切换,明天有人可以补充 日志语句或延迟缓存或设置咨询 文件。 [...]
答案 1 :(得分:11)
请注意,yield from
的可能用途只是asynch PEP的一小部分,并且永远不会需要。也许Guido在他的演讲中超卖了他们; - )
至于为什么函数没有被改变为默认情况下总是异步,这只是现实主义。 Asynch噱头带来了新的开销和语义复杂性,而且Python不会减慢速度并使所有的生活复杂化,使一些应用程序更容易编写。
简而言之,“实用性胜过纯洁”; - )