sig*_*mus 10 python python-3.x python-requests grequests
我需要使用Requests库发出异步请求。在Python 3.7中,如果尝试from requests import async
得到SyntaxError: invalid syntax
。
async
已在Python 3.7中保留。如何解决这种情况?
与请求库在一起的卢卡萨说:
目前,尚无计划支持异步和等待。这不是因为它们不是一个好主意:它们是。这是因为要使用它们需要进行相当大的代码更改。现在,请求是一个纯同步库,该库在其堆栈的底部
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())
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用 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())
Run Code Online (Sandbox Code Playgroud)