Даже используя asyncio и aiohttp, методы ждут ответа на запрос

Привет, у меня есть следующая проблема, я хочу выполнить метод getlastItemFromGivenInterval, дать ему кратко пройти, не дожидаясь ответа на запрос, и дать контекст asyncio.sleep(60) для выполнения всей процедуры еще раз за 60-секундные периоды времени. То, что я получаю, ждет в getLastItemFromGivenInterval() для завершения запроса.

import aiohttp
import asyncio

loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_forever()

async def main():
    async with aiohttp.ClientSession() as session:
        while True:
            await bc.getLastItemFromGivenInterval(session)
            await asyncio.sleep(60)

async def getLastItemFromGivenInterval(session):
    async with session.get(BinanceClient.base_endpoint + "/api/v1/time") as currentServerTime:
        currentServerTime = await currentServerTime.json()
        currentServerTime = currentServerTime['serverTime']

    async with session.get(url) as res:
        response = await res.json()
        array = []
        print(response)

        return response

getLastItemFromGivenInterval размещается в отдельном классе. Пожалуйста, дайте мне подсказку, как добиться эффекта не ожидания в методе getLastItem...().

1 ответ

Если я вас правильно понимаю, вы хотите начать getLastItemFromGivenInterval в фоновом режиме, и делайте это каждые 60 секунд, независимо от того, сколько времени потребуется, чтобы завершить. Вы можете заменить await с create_taskи затем никогда не ожидаем полученного задания:

loop = asyncio.get_event_loop()
while True:
    # spawn the task in the background, and proceed
    loop.create_task(bc.getLastItemFromGivenInterval(session))
    # wait 60 seconds, allowing the above task (and other
    # tasks managed by the event loop) to run
    await asyncio.sleep(60)

Вы также можете убедиться, что задачи, выполнение которых занимает много времени или зависает на неопределенный срок (например, из-за сбоя сети), не накапливаются:

loop = asyncio.get_event_loop()
while True:
    # asyncio.wait_for will cancel the task if it takes longer
    # than the specified duration
    loop.create_task(asyncio.wait_for(
        bc.getLastItemFromGivenInterval(session), 500))
    await asyncio.sleep(60)
Другие вопросы по тегам