У мене дуже багато проблем з більшістю опублікованих відповідей - вони або використовують застарілі бібліотеки, перенесені з обмеженими можливостями, або надають рішення з надто великою магією при виконанні запиту, що ускладнює обробку помилок. Якщо вони не належать до однієї з перерахованих вище категорій, вони є сторонніми бібліотеками або застарілими.
Деякі з рішень спрацьовують виключно в http-запитах, але рішення не відповідають будь-яким іншим запитам, що смішно. Тут не потрібні високомобільні рішення.
Просто використання вбудованої бібліотеки python asyncio
є достатньою для виконання асинхронних запитів будь-якого типу, а також забезпечує достатню плинність для складних та корисних випадків обробки помилок.
import asyncio
loop = asyncio.get_event_loop()
def do_thing(params):
async def get_rpc_info_and_do_chores(id):
# do things
response = perform_grpc_call(id)
do_chores(response)
async def get_httpapi_info_and_do_chores(id):
# do things
response = requests.get(URL)
do_chores(response)
async_tasks = []
for element in list(params.list_of_things):
async_tasks.append(loop.create_task(get_chan_info_and_do_chores(id)))
async_tasks.append(loop.create_task(get_httpapi_info_and_do_chores(ch_id)))
loop.run_until_complete(asyncio.gather(*async_tasks))
Як це працює просто. Ви створюєте низку завдань, які хочете виконувати асинхронно, а потім просите цикл виконати ці завдання та вийти після завершення. Немає зайвих бібліотек, які не піддаються технічному обслуговуванню, відсутність функціональності.