asyncio
我看过的图书馆
@asyncio.coroutine
def function():
...
和
async def function():
...
可互换使用。
两者之间有功能上的区别吗?
是的,使用async def
语法的本地协程和使用asyncio.coroutine
装饰器的基于生成程序的协程之间在功能上有所不同。
根据PEP 492引入的async def
语法:
- 原生协程 对象不实现
__iter__
和
__next__
方法。因此,它们不能被遍历或传递给iter()
,list()
,tuple()
和其他内置插件。它们也不能for..in
循环使用。尝试在本机协程对象上使用
__iter__
或__next__
对本机协程对象进行尝试将导致TypeError。
普通生成器 无法 生成
yield from
本地协程 :这样做将导致TypeError。基于生成器的协程 (对于异步代码必须用修饰
@asyncio.coroutine
)可以yield from
原生协程对象 。
inspect.isgenerator()
并inspect.isgeneratorfunction()
返回False
了
原生协程 对象和 原生协程功能 。
上面的要点1表示,虽然使用@asyncio.coroutine
装饰器语法定义的协程函数可以像传统的生成器函数一样工作,但使用该语法定义的协程函数async def
不能。
这是用两种语法定义的两个最小的,表面上等效的协程函数:
import asyncio
@asyncio.coroutine
def decorated(x):
yield from x
async def native(x):
await x
尽管这两个函数的字节码几乎相同:
>>> import dis
>>> dis.dis(decorated)
5 0 LOAD_FAST 0 (x)
3 GET_YIELD_FROM_ITER
4 LOAD_CONST 0 (None)
7 YIELD_FROM
8 POP_TOP
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
>>> dis.dis(native)
8 0 LOAD_FAST 0 (x)
3 GET_AWAITABLE
4 LOAD_CONST 0 (None)
7 YIELD_FROM
8 POP_TOP
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
…唯一的区别是GET_YIELD_FROM_ITER
vs GET_AWAITABLE
,当尝试遍历返回的对象时,它们的行为完全不同:
>>> list(decorated('foo'))
['f', 'o', 'o']
>>> list(native('foo'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'coroutine' object is not iterable
显然'foo'
这不是一个可等待的过程,因此native()
使用它进行调用的意义不大,但是希望可以很清楚地看出coroutine
,无论返回的对象如何,它都是不可迭代的。
Brett Cannon对async
/await
语法进行了更详细的研究:异步/等待在Python
3.5中如何工作?
涵盖了更深层次的差异。
问题内容: 由于Servlet 3.0 支持异步处理。使用始终异步处理会更好吗?或者在什么情况下同步处理更好? 问题答案: 异步Servlet带来的最大好处是HTTP push ,在该服务器中,服务器可以在选择时向客户端发送信息,而不是在客户端请求时将信息发送回客户端。在异步Servlet之前,这将需要长时间运行的HTTP连接,每个HTTP连接都会束缚服务器线程,这是非常低效的。这个新模型使服务器
主要内容:同步时钟,实例,实例,异步时钟关键词: 同步,异步 由第 3 章可知,当触发器输入端的数据和触发器的时钟不相关时,很容易导致电路时序不满足。本章主要解决模块间可导致时序 violation 的异步问题。 关于异步与同步的定义,许多地方都有介绍,细节上也有所差异。本章主要的关注点是解决异步问题的方法,而不关心为什么会出现异步时钟,也不关心异步电路的具体结构,仅从异步时钟的时序结果去分析解决问题。 同步时钟 数字设计中,一般认为,
问题内容: 我已经将kriskowal的Q库用于一个项目(Web刮板/人类活动模拟器),并且熟悉了Promise,将其返回并解决/拒绝它们,并且该库的基本异步控制流方法和错误抛出/捕获机制已得到证明。必要。 我遇到了一些问题。我的电话和回叫有形成金字塔的异常趋势。有时是出于范围限制的原因,而其他时候是为了保证一定顺序的事件。(我想我也许可以通过重构来解决其中的一些问题,但是今后我想完全避免“回调地
然后我有了调用webAPI的dataLayer,它看起来像这样。为了简单起见,我直接使用。result。 我的问题是,我看到一些教程说我们应该避免使用。result,因为它可能会导致死锁。我不确定在我的情况下是否需要使用Async/await?如果我确实需要,我知道我应该一直异步,但我确实希望我的controlLayer是同步的,因为我有其他层调用controlLayer的函数,我不希望所有层的函
为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击、激活焦点、失去焦点等;再比如我们用ajax请求数据,使用回调函数获取返回值。这些都属于异步编程。 也许你已经大概知道JavaScript引擎单线程的概念,那么这种单线程模式和异步编程有什么关系呢? JavaScript引擎中,只有一个主线程,当执行JavaScript代码块时,不允许其他代码块执行,而事件机制和回调机制的
更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我