Как перебирать цикл API одновременно с asyncio pythonPython

Программы на Python
Ответить
Anonymous
 Как перебирать цикл API одновременно с asyncio python

Сообщение Anonymous »

Мой код запрашивает два API-интерфейса и сравнивает их. Я выполняю итерацию по словарю в цикле for, чтобы определить, куда направить запрос на получение. Отправка GET, ожидание ответа, затем выполнение математических вычислений и переход к следующему элементу словаря занимают много времени из-за ожидания ответа.
Существует множество разговоров, для которых asyncio является решением. это, но фрагменты кода, которые я вижу в ответах, похоже, не помогают (или я не могу понять, как их применить). См. здесь, здесь, здесь отличные беседы об asyncio. Я совершенно уверен, что если я группирую запросы, это значительно ускорит итерацию. IE отправляет 20 запросов (произвольно), получает 20 ответов, сравнивает результаты, повторяет.
Вот мой неасинхронный код, немного измененный для удобства чтения.

Код: Выделить всё

value_ops = {'name1':['text','ticker1','ticker2','ticker3'],
'name2':['text','ticker1','ticker2','ticker3'],
...
}

# This are the two api GET reqeusts
def pm_check(od_pm,pSide):
#[code cunk here] output is json that I'm grabbing two values from

def ks_check(od_ks,kSide,direction):
#[code cunk here] output is json that I'm grabbing two values from

def opp_check(tradename,ticker1,ticker2,ticker3):
pm_check(ticker1,'asks')
ks_check(ticker2,'yes','buy')
#comparison math code chunk omitted

for value in value_ops.values()
opp_check(*value)
Итак, работающий код выполняет итерацию по словарю, чтобы получить значения, передает их в функцию вызова API, выполняет некоторые вычисления, а затем переходит к следующему значению для повторения.< /p>
Я думаю, что конечной точкой будет отправка всех запросов API одновременно, сохранение их в таблице, а затем выполнение некоторых вычислений по всей этой таблице. IE в пакете по 20 штук и т. д.
В качестве отправной точки я пробовал:

Код: Выделить всё

value_ops = {'name1':['tradename','ticker1','ticker2','ticker3'],
'name2':['tradename','ticker1','ticker2','ticker3'],
...
}

# This are the two api GET reqeusts
async def pm_check(od_pm,pSide):
#[code cunk here] output is json that I'm grabbing two values from

async def ks_check(od_ks,kSide,direction):
#[code cunk here] output is json that I'm grabbing two values from

async def opp_check(tradename,ticker1,ticker2,ticker3):
pm_check(ticker1,'asks')
ks_check(ticker2,'yes','buy')
#comparison math code chunk omitted

import asyncio
async def process_all():
tasks = []
async for value in value_ops.values():
task = asyncio.create_task(opp_check(*value))
tasks.append(task)
await asyncio.gather(*tasks)

asyncio.run(process_all())
Я надеялся, что это позволит мне доказать концепцию асинхронной итерации в моем цикле. Выдает ошибку времени выполнения [asyncio.run() не может быть вызвана из работающего цикла событий]. Я подозреваю, что, хотя я и смогу обойти эту ошибку, результат на самом деле не будет тем, что я ищу.
Любые отзывы о том, как ускорить этот процесс, приветствуются. Я также пробовал многопроцессорную обработку, но это не помогло мне ускориться (что, я думаю, имеет смысл, это не проблемы с процессором, а время простоя во время ожидания ответа GET).

Подробнее здесь: https://stackoverflow.com/questions/792 ... cio-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»