Форум сайта python.su
Приветствую всех.
Есть бот, часть своих данных для генерирования ответов получает из внешних источников и заполняет свои трехмерные списки. Установлен период актуальности данных, т.е. если прошло более заданного времени от крайнего обращения пользователя, бот выдает предупреждение и лезет наружу собирать данные, после этого выдает сгенерированный ответ.
Проблема в следующем-время на формирования своих списков бот сейчас тратит порядка 4-х минут, т.е. для пользователя после предупреждения бот 4 минуты “висит”.
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
Пробовал разные методы, но как-то пока…
Подскажите в какую сторону смотреть, должно-же существовать готовое решение?
Отредактировано ivin (Фев. 3, 2020 07:56:42)
Офлайн
Не давать пользователю предупреждение, пока не подготовлены данные?
Забирать данные заранее до времени Х ?
Офлайн
еще раз..
допустим функция collector через определенный интервал занимается сбором, предварительной подготовкой и складированием данных в базу (список), этот список является как-бы кэшем данных. Другие функции постоянно обрабатывают эти данные.
каким образом запускать collector на исполнение которой требуется некоторое количество времени не останавливая основной код -работу других функций пользующихся данными сформированными collector?
не знаю, насколько правильно выразился…
з.ы. обмен через сохраненный файл со списком нежелателен.
Отредактировано ivin (Фев. 3, 2020 11:55:27)
Офлайн
lifemakerзабирать данные в “фоне”
Забирать данные заранее до времени Х ?
Офлайн
ivinучитывая весьма общую постановку вопроса, ничего более внятного чем threading, multiprocessing или asyncio для “фонового выполнения” посоветовать сложно.
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
[code python][/code]
Отредактировано PEHDOM (Фев. 3, 2020 14:40:47)
Офлайн
Добавьте себе планировщик apscheduler; обратите внимание на классы BackgroundScheduler, IntervalTrigger
Офлайн
вот по apscheduler у меня отдельный вопрос…
требуется запуск функции ежедневно в определенное время. сейчас используется стандартный код:
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
print ('ждем сработки таймера')
#@sched.scheduled_job('cron', day_of_week = 'mon-sun', hour = 10, minute = 35)
#@sched.scheduled_job('cron', day_of_week = '0-6', hour = 10, minute = 35)
#@sched.scheduled_job('cron', hour = 10, minute = 35)
@sched.scheduled_job('cron', day_of_week = 'mon,tue,wed,thu,fri,sat,sun', hour = 10, minute = 35)
def scheduled_job():
print('запуск действия по таймеру ')
print ('ждем следующей сработки')
sched.start() # запуск таймера
Отредактировано ivin (Фев. 5, 2020 14:18:56)
Офлайн
по BackgroundScheduler..
поясните что там работает в фоне? сам планировщик, функция которую он дергает или то и другое?
Офлайн
ivin
поясните что там работает в фоне? сам планировщик, функция которую он дергает или то и другое?
A scheduler that runs in the background using a separate thread…https://apscheduler.readthedocs.io/en/stable/modules/schedulers/background.html
BackgroundScheduler runs in a thread inside your existing application. Calling start() will start the scheduler and it will continue running after the call returns.
[code python][/code]
Офлайн
сейчас тестирую вот этот пример:
https://github.com/agronholm/apscheduler/blob/master/examples/schedulers/background.py
с небольшим изменением в цикле имитации активности приложения
while True: x = input('>>>') print ('работа проги -',x)
Отредактировано ivin (Фев. 5, 2020 15:30:15)
Офлайн