【问题标题】:Using Requests library to make asynchronous requests with Python 3.7使用 Requests 库通过 Python 3.7 发出异步请求
【发布时间】:2019-01-11 11:20:38
【问题描述】:

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

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

【问题讨论】:

  • 有几种导入方式。 importlib.import_module(".async", "requests")。但实际上我也得到了ModuleNotFoundError: No module named 'requests.async'
  • Python 3.6 也会出现这个问题。显然 requests 很久以前就完全放弃了 async 模块,但文档对此并不是很清楚。
  • 是的,我想是的。你可以试试aiohttpgrequests

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


【解决方案1】:

请求库中的 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())

【讨论】:

【解决方案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())

【讨论】:

  • 这是在线程池中运行同步方法。绝对不能利用异步 IO 的优势。
  • 那么这是异步还是阻塞?
  • 这是一个异步函数
  • 有没有办法限制同时连接的数量?如果我需要 10 万个请求,但一次只能限制为 10 个,那该怎么做?
  • @user1717828 将其划分为块并在每个块上使用“run_until_complete”
猜你喜欢
  • 1970-01-01
  • 2017-12-25
  • 2018-07-04
  • 2013-03-12
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多