下面是一个使用asyncio和aiohttp从多个网站下载主页的玩具示例:
导入异步IO
进口aiohttp
地点=[
“http://google.com”,
“http://reddit.com”,
“http://wikipedia.com”,
“http://afpy.org”,
“http://httpbin.org”,
“http://stackoverflow.com”,
“http://reddit.com”
]
异步def主(站点):
对于站点中的站点:
下载(网站)
异步def下载(站点):
response=wait client.get(站点)
content=等待响应。read()
打印(站点、镜头(内容))
loop=asyncio.get\u event\u loop()
client=aiohttp.ClientSession(loop=loop)
内容=循环。运行直到完成(主(站点))
client.close()
如果我运行它,我会得到:
运行时警告:从未等待协同程序“下载”
但我不想等待
在这方面,我可以做到:
站点中的站点的
:
下载(网站)
如果我没有显式地“屈服”或向返回的Deferred添加回调,它只会运行而不会阻塞或抱怨。我无法访问结果,但在这种情况下,我不需要它
在JS中,我可以做到:
site.forEarch(站点){
donwload(现场)
}
再说一次,它不会阻碍我,也不需要我的任何东西
我找到了一种方法:
异步def主(站点):
wait asyncio.wait([站点中的站点的下载(站点)])
但是:
- 这真的不是很容易发现的。我觉得很难记住
- 很难理解它的作用。“waits”似乎是说“i block”,但并没有清楚地表示它阻止了整个协同路由列表的完成
- 您不能传入生成器,它需要是一个真正的列表,我觉得在Python中这是非常不自然的
- 如果我只有一个等待着呢
- 如果我根本不想等待我的任务,只计划执行它们,然后继续我的其余代码呢
- 这比twisted和JS解决方案要详细得多
有更好的办法吗
要将协同路由安排为任务,请使用asyncio.Sure\u future:
站点中的站点的
:
coro=下载(站点)
未来=异步。确保未来(coro)
它替换了版本3.4.4中不推荐使用的函数asyncio.async
然后,您可以使用wait、asyncio.wait或asyncio.gather管理这些未来