aiohttp - одновременные запросы зависают - PullRequest
0 голосов
/ 16 апреля 2019

Параллельные запросы зависают.Вот пример кода, который я использую для тестирования одновременных запросов.

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        print(await response.text())

async def main(n):
    url = "https://httpstat.us/200"
    async with aiohttp.ClientSession() as session:
        tasks = [asyncio.create_task(fetch(session, url)) for _ in range n]
        await asyncio.gather(*tasks)

asyncio.run(main(10))

Когда я делаю 10 одновременных запросов, первые 4-5 запросов выполняются одновременно, а затем он зависает в течение более 10 секунд, а затем запускаетсяостальные задачи, которые снова зависают после выполнения 2-3 параллельных запросов.Если я делаю 100 одновременных запросов, он делает около 25-30 одновременных запросов и зависает, а затем делает 5-6 запросов и снова зависает, он делает это до тех пор, пока все задачи не будут выполнены.

Это займет более двух минутсделать 100 запросов к https://httpstat.us/200 с помощью aiohttp.

Если я не использую постоянный ClientSession и создаю новый ClientSession для каждого запроса, то все сотни запросов завершаются в течение 5 секунд, не зависая.

Я не уверен, что я здесь делаю.Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 02 мая 2019

Мне удалось запустить этот код, используя: python 3.7, asyncio 3.4.3, aiohttp 3.5.4

import aiohttp 
import asyncio 

async def fetch(session, url): 
    async with session.get(url) as response: 
        print(await response.text()) 

async def main(n): 
    url = "https://httpstat.us/200" 
    async with aiohttp.ClientSession() as session: 
        tasks = [asyncio.create_task(fetch(session, url)) for _ in range (0,n)] 
        await asyncio.gather(*tasks) 

asyncio.run(main(10))  
...