10

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

要点是,如果您想要异步运行某些东西,您可以使用"yield from" + expression和几个装饰器来指定对后面的调用yield from应该异步执行。关于它的好处是您可以正常读取该函数中的语句(好像它是同步的),并且它的行为就好像它对于该函数的执行是同步的(返回值和错误/异常传播和处理)。

我的问题是:为什么不采取相反的行为,即所有函数调用默认为异步(并且没有yield from),并且当您想要同步执行某些内容时具有不同的显式语法?

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

4

2 回答 2

16

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

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

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

于 2013-11-26T13:45:31.937 回答
11

请注意,可能的用途只是异步 PEPyield from的一小部分,并且永远不需要使用。也许Guido在他的演讲中超卖了他们;-)

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

简而言之,“实用胜于纯粹”;-)

于 2013-10-20T00:05:20.520 回答