Правильная работа asyncio sleep
у меня стоит задача, оповещать каждую минуту, информацию об аукционе, есть такой код, но не уверен что это нормальная реализация, можно как-нибудь получать сколько осталось задержки в функции или как-то профитнее это сделать? Текущая реализация:
import asyncio
async def draw_info(auction):
print("до окончания 5 минут")
await asyncio.sleep(60)
print("до окончания 4 минуы")
await asyncio.sleep(60)
print("до окончания 3 минуы")
await asyncio.sleep(60)
print("до окончания 2 минуы")
await asyncio.sleep(60)
print("до окончания 1 минута")
await asyncio.sleep(60)
asyncio.ensure_future(draw_info())
Ответы (1 шт):
Автор решения: eri
→ Ссылка
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.call_at - планировщик задач
import asyncio
def draw_info(timestamp):
loop = asyncio.get_event_loop()
for i in range(1, 5):
loop.call_at(
timestamp-i*60, # время, после которого выполнится
print, # обычная функция
"до окончания {i} минут".format(i=i) # аргументы (*args) для функции
)
timestamp = time.time() + 310
draw_info(timestamp)
# тут можно запланировать другие задачи, запустить сервисы и прочее
asyncio.get_event_loop().run_forever()
Погрешность не накапливается в отличие от sleep и зависит только от времени выполнения асинхронной функции из остального кода.
Если остальной код не блокирующий, а тяжелая математика вынесена в экзекуторы - погрешностью времени можно принебречь (меньше долей секунды)