使用请求库通过Python 3.7发出异步请求

时间:2018-08-03 14:24:50

标签: python python-3.x python-requests grequests

我需要使用Requests库制作asynchronous requests。在Python 3.7中,如果尝试from requests import async,我会得到SyntaxError: invalid syntax

async已成为reserved with in Python 3.7。我如何解决这种情况?

2 个答案:

答案 0 :(得分:4)

与请求库在一起的卢卡萨说:

  

当前,没有计划支持异步和等待。这不是因为它们不是一个好主意:它们是。这是因为要使用它们需要进行相当大的代码更改。   现在,请求是一个纯同步库,该库在其堆栈的底部使用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())

答案 1 :(得分:2)

您可以使用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())
相关问题