task_0 = asyncio.create_task(get_request(session, url))
response = await task_0
task_1 = asyncio.create_task(parse_json(response))
await asyncio.gather(task_0, task_1)
Абсолютно бесполезный код. Ты дожидаешься (await) выполнения task_0, а потом пытаешься параллельно выполнить (gather) task_0 и task_1, хотя task_0 уже выполнена.
Более того, почему разбор JSON у тебя async, если он не делает вообще ничего асинхронного?
Просто сверни всё в одну функцию, и выполняй сотню её копий через gather().
async def handle_request(session, url):
async with session.get(url) as response:
data = await response.json()
results = []
for outcomes in data:
results.append(
(outcomes["payload"]["id"],
outcomes["payload"]["name"],)
)
return results
А потом при вызове:
session = ...
urls = [ .................. ]
tasks = [handle_request(session, url) for url in urls] #набор невыполненных асинхронных задач
# планируем их выполнение "одновременно"
all_results = asyncio.gather(*tasks) #почитай про return_exceptions
for results in all_results:
pass #тут уже работаешь с возвращённым значением