对于下面给定的协程(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
最佳答案
await EXPR
表示事件任务调度程序可以在这一步打开其他东西(例如,从任务队列中拉出准备好的东西),同时也表明 EXPR
是可以等待的。如果 EXPR
是一个协程,这意味着它内部可以有后续的 await
,并且当这个协程处于非阻塞等待状态时(比如IO或网络响应、休眠等)
关于python - await 关键字如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043726/