在使用asyncio和aiohttp请求的情况下,没有从服务器获得任何响应



我正在尝试使用asyncio和aiohttp在python中发送异步请求。虽然我试图一次发出多个请求并将它们全部发送到服务器,但大多数请求的响应状态为200。我所面临的问题是,无论我是发出200个请求还是1000个请求,最后都有一些待处理的请求,这些请求总是在5到50之间。(注意,如果只发出100个请求并且程序成功完成,我不会遇到任何问题。只有当我的请求超过100个时才会这样。)对于这5到50个待处理的请求,我没有得到任何响应代码或任何东西,因此我的程序一直卡住,没有完成。我知道通过脚本发出大量请求可能会导致服务器暂时禁止。但在这种情况下,我至少应该得到一个403状态码,对吗?但是对于那些5到50个待处理的请求,我没有得到任何东西,对于所有其他已经完成的请求,除了那些待处理的请求,我得到一个200的状态码。这是我的代码。

import asyncio
import aiohttp
import time
async def make_request(session,link,i):
async with session.get(link) as response:
loop = asyncio.get_running_loop()
print(len(asyncio.tasks.all_tasks(loop)))  #To see how many requests/tasks are pending in the event loop
print(f"request:{i}")
print(response.status)
# print(response.status)
async def make_task(link):
tasks = []
async with aiohttp.ClientSession() as session:
tasks = [asyncio.create_task(make_request(session,link,i)) for i in range(no_of_requests)]
await asyncio.wait(tasks,return_when=asyncio.ALL_COMPLETED)  #Getting same outcame with .gather as well.

asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(make_task("https://ocw.mit.edu"),debug=True)

这是一个请求数= 100的ss这里的请求数是200这里的请求数是1000

谁能告诉我这里到底发生了什么?我无法理解服务器是否阻止了我,如果是这样,为什么我没有得到一些40X状态码的响应?

但在这种情况下,我应该得到一个403状态码至少正确…?

不一定。如果服务器认为它受到了DoS攻击,它可以选择根本不发送响应。

我建议在你自己的服务器上测试一下,以排除这种情况。

如果您的客户端由于未回答的请求而没有完成,您应该跟踪它们并在终止之前以某种方式取消它们。你可以让asyncio为一个请求返回一个future,以后你可以用它来取消它。

最新更新