Даже используя asyncio и aiohttp, методы ждут ответа на запрос - PullRequest
0 голосов
/ 30 декабря 2018

Привет, у меня есть следующая проблема, я хочу выполнить метод 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 Ответ

0 голосов
/ 31 декабря 2018

Если я вас правильно понимаю, вы хотите запустить 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)
...