对于给定的以下协同例程(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
关键字是否在后台引入了带有线程的事件循环(任务调度程序),如本示例code
答案 0 :(得分:1)
await EXPR
意味着事件任务计划程序可以在此步骤打开其他功能(例如,从任务队列中拉出已准备好的内容),并且还指示EXPR
可以等待。如果EXPR
是协程,则意味着它可以包含后续的await
,并且当此协程处于非阻塞等待状态(例如IO或网络响应,睡眠)时,同样可以执行其他操作等)