我需要使用 Requests 库发出异步请求。在 Python 3.7 中,如果我尝试from requests import async
我得到SyntaxError: invalid syntax
.
async
在 Python 3.7 中已成为保留的 with。我该如何解决这种情况?
请求库中的 Lukasa 说:
目前没有计划支持异步和等待。这并不是因为它们不是一个好主意:它们是。这是因为使用它们需要相当大的代码更改。现在 requests 是一个纯粹的同步库,在其堆栈的底部,用于
httplib
发送和接收数据。除非我们替换 httplib,否则我们无法迁移到异步模型。我们能做的最好的就是提供一个在线程中运行请求的速记,但是 asyncio 已经有了这样的速记,所以我不相信它会有价值。现在我正在悄悄地研究我们是否可以重写请求,使其在同步环境中和在异步环境中一样好。然而,现实情况是这样做需要做很多工作,包括重写我们的很多堆栈,而且可能很多年都不会发生,如果有的话。
但是不要担心aiohttp
与请求非常相似。
这是一个例子。
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://python.org')
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
您可以使用 asyncio 发出异步请求。这是一个例子:
import asyncio
import requests
async def main():
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(
None,
requests.get,
'http://example.org/'
)
for i in range(20)
]
for response in await asyncio.gather(*futures):
pass
loop = asyncio.get_event_loop()
loop.run_until_complete(main())