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

2024-06-01 02:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

当Guido talked介绍Tulip时,我参加了SF Python会议,这是Python中用于异步操作的未来异步库。在

要做的是,如果希望异步运行某个东西,可以使用"yield from" + expression和几个修饰符来指定对yield from之后的内容的调用应该异步执行。它的好处是,您可以正常地读取该函数中的语句(就像它是同步的一样),并且它的行为就好像与该函数的执行是同步的一样(返回值和错误/异常传播和处理)。在

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

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


Tags: 函数from内容错误语法语句sf修饰符
2条回答

真正的答案是Guido喜欢异步屈服点在协程中是显式的这一事实,因为如果您没有意识到调用可以产生结果,那么这会引发并发问题,比如线程。但是如果您必须编写一个显式的yield from,那么很容易确保它不会落在两个关键操作的中间,而这两个操作对于代码的其余部分来说应该是原子的。在

正如他提到的in his PyCon 2013 keynote,还有其他Python异步框架,比如Gevent,默认情况下是异步的,他不喜欢这种方法。(11点58分):

And unfortunately you're still not completely clear of the problem that the scheduler could at a random moment interrupt your task and switch to a different one. [...] Any function that you call today that you happen to know that it never switches, tomorrow someone could add a logging statement or a lazy caching or a consulting of a settings file. [...]

请注意,yield from的可能用途只是asynch PEP的一小部分,而且永远不需要使用。也许吉多在谈话中夸大了他们;-)

至于为什么函数在默认情况下没有被更改为总是异步的,这只是现实。异步技巧带来了新的开销和语义复杂性,Python不会减慢速度并使所有人的生活变得复杂,从而使一些应用程序更容易编写。在

简而言之,“实用胜过纯洁”;—)

相关问题 更多 >