使用Requests库在Python 3.7中发出异步请求

t98cgbkg  于 2023-05-30  发布在  Python
关注(0)|答案(3)|浏览(305)

我需要使用Requests库发出异步请求。在Python 3.7中,如果我尝试from requests import async,我会得到SyntaxError: invalid syntax
async已变为reserved with in Python 3.7。我该如何解决这种情况?

gorkyyrv

gorkyyrv1#

Lukasa谁是与请求lib说:
目前还没有计划支持async和await。这并不是因为它们不是一个好主意:是的。这是因为使用它们需要相当大的代码更改。现在requests是一个纯同步库,在其堆栈的底部,使用httplib发送和接收数据。我们不能迁移到异步模型,除非我们替换httplib。我们能做的最好的就是提供一个在线程中运行请求的简写,但是asyncio已经有了这样的简写,所以我不认为它有什么价值。现在,我正在静静地研究我们是否可以重写请求,使其在同步环境中和在异步环境中一样好。然而,现实是这样做将是大量的工作,涉及重写我们的很多堆栈,并且可能在许多年内不会发生,如果有的话。
但是不用担心aiohttp和request非常相似。
举个例子。

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())
6ljaweal

6ljaweal2#

你可以使用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())
wmvff8tz

wmvff8tz3#

你可以使用hyper-requestshttps://github.com/edjones84/hyper-requests),它允许你传入一个url和参数的列表来异步运行,如下所示:

import hyper_requests

# Define the request parameters
params = [
    {'url': 'http://httpbin.org/get' , 'data': 'value1'},
    {'url': 'http://httpbin.org/get' , 'data': 'value3'},
    {'url': 'http://httpbin.org/get' , 'data': 'value5'},
    {'url': 'http://httpbin.org/get' , 'data': 'value7'},
    {'url': 'http://httpbin.org/get' , 'data': 'value9'}
]

# Create an instance of AsyncRequests and execute the requests
returned_data = hyper_requests.get(request_params=params, workers=10)

# Process the returned data
for response in returned_data:
    print(response)

相关问题