对于下面的协程(
我的理解是,使用语法
如果相同的函数 (
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()
执行第一行并在 yield
关键字处阻塞。我的理解是,使用语法
cr=f(resp)
时,在幕后没有事件循环(任务调度程序)和线程。
如果相同的函数 (
h
) 中有以下提到的 await f(resp)
(await
关键字要求使用 async
语法),而不是说 cr=f(resp)
(如上所述),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
可以用于任何协程/任务/未来对象,因此在协程方面并没有太大的区别(异步方法实际上是协程,参见:https://repl.it/repls/OrchidWarmheartedLinks)。异步/等待的威力在于任务中,其中方法可以在后台线程中调度,从而可以并发运行。想象一下启动下载,在此期间进行一些计算,并在实际需要数据时await
数据。我会留下一个完整的答案给那些能更好地解释它的人,因为这个材料对我来说也是相当新的。 - Caramiriel