首页 > 解决方案 > 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在幕后引入了带有线程的事件循环(任务调度程序),如本示例代码所示

标签: pythonpython-3.xasynchronousasync-awaitcoroutine

解决方案


await EXPR意味着事件任务调度程序可以在这一步打开其他东西(例如,从任务队列中拉出准备好的东西),并且还表明这EXPR是可等待的。ifEXPR是协程,表示它await里面可以有后续的s,当这个协程处于非阻塞等待状态(比如IO或者网络响应,sleep等)时,也可以执行别的东西


推荐阅读