我正在做的事情-我试图使用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()
调用一个异步函数,然后从那里继续。