使用异步任务的无限循环在回调中获取aiohttp请求响应



我正在做的事情-我试图使用asyncio和aiohttp在无限循环中发出多个post请求(对具有不同参数的同一URL(。

def callback(response):
print(response) 
async def make_request(session, payload, sema):
async with sema, session.post(url=URL, headers=HEADERS, data=json.dumps(payload)) 
as response:
return await response.json()

async def generate_requests(payloads):
tasks = []
sema = asyncio.BoundedSemaphore(value=100)
async with aiohttp.ClientSession() as session:
for payload in payloads:
tasks.append(make_request(session, payload, sema))
results = await asyncio.gather(*tasks, return_exceptions=True)
print(results)

def run_asyncio_requests():
loop = asyncio.get_event_loop()
while True:
for country in countries:
cities = country.cities
loop.run_until_complete(generate_requests(cities))

if __name__ == '__main__':
run_asyncio_requests()

问题:run_asyncio_requests函数生成并发出多个请求(针对一个国家的城市(,然后等待一个国家请求的所有响应,然后执行下一个国家/地区请求。

我想要的:所有国家/地区的请求都应该同时执行,回调(与每个请求相关的某种函数(函数应该处理每个响应,因为每个请求的请求后响应时间不同。它不应该等待收集所有的回复。请求应该在每个循环(无限循环(中生成,后台的回调函数应该与每个响应链接。我知道我正在使用asyncio.collecte来获取所有响应,直到请求完成。但我不知道该怎么做。

在调用generate_requests时可以应用与调用make_request:时相同的技术

async def generate_all_countries():
tasks = [generate_requests(country.cities) for country in countries]
results = await asyncio.gather(*tasks)
print(results)
if __name__ == '__main__':
asyncio.run(generate_all_countries())

请注意,您不需要run_asyncio_requests作为一个单独的同步函数,您可以简单地使用asyncio.run()调用一个异步函数,然后从那里继续。

最新更新