重要的区别:如果等候的数据不avalible足够快await ...
可以释放背景下的控制,例如。 async with ...
声明也是如此。因此,您的代码只有在resp可用时才能达到print(resp.status)
行。
例如代码:
import aiohttp
import asyncio
import urllib.parse
import datetime
async def get(session, url):
print("[{:%M:%S.%f}] getting {} ...".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname))
async with session.get(url) as resp:
print("[{:%M:%S.%f}] {}, status: {}".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname, resp.status))
doc = await resp.text()
print("[{:%M:%S.%f}] {}, len: {}".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname, len(doc)))
async def main():
session = aiohttp.ClientSession()
url = "http://demo.borland.com/Testsite/stadyn_largepagewithimages.html"
f1 = asyncio.ensure_future(get(session, url))
print("[{:%M:%S.%f}] added {} to event loop".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname))
url = "https://stackoverflow.com/questions/46445019/aiohttp-when-is-the-response-status-available"
f2 = asyncio.ensure_future(get(session, url))
print("[{:%M:%S.%f}] added {} to event loop".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname))
url = "https://api.github.com/events"
f3 = asyncio.ensure_future(get(session, url))
print("[{:%M:%S.%f}] added {} to event loop".format(datetime.datetime.now(), urllib.parse.urlsplit(url).hostname))
await f1
await f2
await f3
session.close()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
可以产生这样的结果:
[16:42.415481] added demo.borland.com to event loop
[16:42.415481] added stackoverflow.com to event loop
[16:42.415481] added api.github.com to event loop
[16:42.415481] getting demo.borland.com ...
[16:42.422481] getting stackoverflow.com ...
[16:42.682496] getting api.github.com ...
[16:43.002515] demo.borland.com, status: 200
[16:43.510544] stackoverflow.com, status: 200
[16:43.759558] stackoverflow.com, len: 110650
[16:43.883565] demo.borland.com, len: 239012
[16:44.089577] api.github.com, status: 200
[16:44.318590] api.github.com, len: 43055
澄清(THX @deceze):在这里你可以看到(看括号之间的时间),所有的协同程序在发送检索网站的请求之后释放控件,并在等待响应文本的同时第二次释放控件。与stackoverflow相比,borland也有很多文本(排除了其他网络特征),尽管之前提出请求,但它只是在打印完stackoverflow文本之后才显示出来。
你不能。状态是响应标题,它不会“更新”。 –
什么?在得到答复之前,您不具备*身份。 – jonrsharpe
这就是我正在阅读的[这里](http://aiohttp.readthedocs.io/en/stable/client.html)。如果我不检查状态,我该如何处理失败代码? –