python - await 关键字如何工作?
问题描述
对于以下给定的协程(f
),
import csv
import urllib
def f(resp):
print('Line 1')
yield csv.reader(resp.read().decode('utf-8'))
def h():
url = 'http://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NYSE&render=download'
resp = urllib.urlopen(url)
cr = f(resp)
cr = f(resp)
将迭代器对象分配给cr
,
cr.next()
执行第 1 行并在 yield 关键字处阻塞。
我的理解是,在语法cr=f(resp)
上没有带线程的事件循环(任务调度程序),在幕后
而不是说cr=f(resp)
(上面),如果相同的函数(h
)具有await f(resp)
如下所述(await
关键字要求async
语法),
async def h_async():
url = 'http://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NYSE&render=download'
resp = urllib.urlopen(url)
await f(resp)
然后,
有何await f(resp)
不同?cr=f(resp)
有何h_async()
不同?h()
关键字是否await
在幕后引入了带有线程的事件循环(任务调度程序),如本示例代码所示
解决方案
await EXPR
意味着事件任务调度程序可以在这一步打开其他东西(例如,从任务队列中拉出准备好的东西),并且还表明这EXPR
是可等待的。ifEXPR
是协程,表示它await
里面可以有后续的s,当这个协程处于非阻塞等待状态(比如IO或者网络响应,sleep等)时,也可以执行别的东西
推荐阅读
- javascript - 新的 Chrome 行为:单击的元素保持在原处,并且在加载新内容时文档滚动位置移动
- arrays - 如何使用powershell将行转换为列
- javascript - 验证上传的 Word 模板 Javascript
- python-3.x - 使用 scipy.stats 将 Weibull 分布拟合到数据是否表现不佳?
- python-3.x - 如果使用 python 计算,JWT hs512 签名与 jwt.io 略有不同
- react-native - 反应原生停止 useEffect() 无限循环
- google-apps-script - 如何删除谷歌应用脚本“例外:条件格式规则不能引用不同的工作表。”
- nlp - Word2vec 和 Glove 模型生成的词表对于同一个语料库是不同的
- python - 在 anaconda 环境中更改 python.exe 文件名
- python - Python Flask-admin 和 API REST