郁金香/ asyncIO:为什么不是所有的调用都是异步的,并指定什么时候应该是同步的?
当Guido talked关于郁金香,在Python中用于异步操作的未来asyncIO库时,我参加了SF Python聚会。郁金香/ asyncIO:为什么不是所有的调用都是异步的,并指定什么时候应该是同步的?
带走的是,如果你想异步运行一些东西,你可以使用"yield from" + expression
和几个装饰器来指定yield from
之后的调用应该异步执行。关于它的好处是,你可以正常读取那个函数中的语句(就好像它是同步的),它的行为就好像它与该函数的执行是同步的(返回值和错误/异常传播和处理)。
我的问题是:为什么不会有相反的行为,即所有的函数调用都是默认的异步(并且没有yield from
),并且当您想同步执行某些操作时有不同的显式语法?
(除了需要另一个关键字/语法规范)
真正的答案是,圭多喜欢的事实是异步的屈服点是明确的协同程序,因为如果你没有意识到,一个呼叫可产量,那么这就是对并发问题的邀请 - 就像使用线程一样。但是如果你必须写一个明确的yield from
,确保它不会落在两个关键操作的中间,这对于其他代码来说应该是原子的,这很容易。
正如他提到的in his PyCon 2013 keynote,还有其他Python异步框架,如Gevent,默认情况下是异步的,他不喜欢这种方法。 (在11:58):
不幸的是你还没有完全清楚的问题 的调度程序可以在随机时刻打断你的任务和 切换到不同的一个。 [...]你今天打电话的任何功能,你碰巧知道它永远不会切换,明天有人可以添加 记录声明或懒惰缓存或设置 文件的咨询。 [...]
注意的yield from
可能的用途是asynch PEP的一小部分,并且从不需要使用。也许Guido在他的谈话中超卖了他们;-)
至于为什么函数没有被改变为默认情况下总是异步,那只是现实主义。 Asynch的噱头带来了新的开销和语义上的复杂性,而且Python不会为了让一些应用程序更容易编写而减慢并且使生活复杂化,使所有人都可以使用。
总之,“实用性节拍纯洁” ;-)
谢谢,我很感激。 – Gabriel
@iCodez我猜asyncio作为标准库的名称将比郁金香更频繁地使用。除了Tulip标签已经用于C++框架。我用'python-asyncio'标记了所有涉及郁金香的Python问题(请参阅'python-multithreading' * * *) –
尝试:'句子= tokenize_sent(your_question); random.shuffle(句子); text =“\ n”.join(句子)'看看理解它有多容易,或者意思是否保持不变。默认情况下,异步会扰乱顺序:所有先发制人的多线程问题都没有好处。 – jfs