Даже используя 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)