Найти - Пользователи
Полная версия: помогите с "фонофым" потоком или процессом или еще как это называется..
Начало » Python для новичков » помогите с "фонофым" потоком или процессом или еще как это называется..
1 2 3
ivin
Приветствую всех.
Есть бот, часть своих данных для генерирования ответов получает из внешних источников и заполняет свои трехмерные списки. Установлен период актуальности данных, т.е. если прошло более заданного времени от крайнего обращения пользователя, бот выдает предупреждение и лезет наружу собирать данные, после этого выдает сгенерированный ответ.
Проблема в следующем-время на формирования своих списков бот сейчас тратит порядка 4-х минут, т.е. для пользователя после предупреждения бот 4 минуты “висит”.
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
Пробовал разные методы, но как-то пока…
Подскажите в какую сторону смотреть, должно-же существовать готовое решение?
lifemaker
Не давать пользователю предупреждение, пока не подготовлены данные?
Забирать данные заранее до времени Х ?
ivin
еще раз..
допустим функция collector через определенный интервал занимается сбором, предварительной подготовкой и складированием данных в базу (список), этот список является как-бы кэшем данных. Другие функции постоянно обрабатывают эти данные.
каким образом запускать collector на исполнение которой требуется некоторое количество времени не останавливая основной код -работу других функций пользующихся данными сформированными collector?
не знаю, насколько правильно выразился…

з.ы. обмен через сохраненный файл со списком нежелателен.
ivin
lifemaker
Забирать данные заранее до времени Х ?
забирать данные в “фоне”
PEHDOM
ivin
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
учитывая весьма общую постановку вопроса, ничего более внятного чем threading, multiprocessing или asyncio для “фонового выполнения” посоветовать сложно.
lifemaker
Добавьте себе планировщик apscheduler; обратите внимание на классы BackgroundScheduler, IntervalTrigger
ivin
вот по 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() # запуск таймера

все работает, но останавливается по непонятной мне причине(больше недели не работает).
варианты записи:
@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)
останавливаются с выводом:

Run time of job “scheduled_job (trigger: cron[day_of_week='mon-sun', hour='10', m
inute='35'], next run at: 2020-03-01 10:35:00 +07)” was missed by 0:00:01.590550
останавливается не обязательно в конце недели, закономерность не выявил.

вариант:
@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)
но пока первый день, данных о работе еще нет.
как должно быть правильно?


ivin
по BackgroundScheduler..
поясните что там работает в фоне? сам планировщик, функция которую он дергает или то и другое?
PEHDOM
ivin
поясните что там работает в фоне? сам планировщик, функция которую он дергает или то и другое?
A scheduler that runs in the background using a separate thread…
BackgroundScheduler runs in a thread inside your existing application. Calling start() will start the scheduler and it will continue running after the call returns.
https://apscheduler.readthedocs.io/en/stable/modules/schedulers/background.html
и то и другое.
ivin
сейчас тестирую вот этот пример:
https://github.com/agronholm/apscheduler/blob/master/examples/schedulers/background.py
с небольшим изменением в цикле имитации активности приложения
         while True:
            x = input('>>>')
            print ('работа проги -',x)
через некоторое количество итераций возникает ошибка:

Run time of job "tick (trigger: interval, next run at: 2020-02-05 18:50:06 +07)“ was missed by 0:00:02.989891
Execution of job ”tick (trigger: interval, next run at: 2020-02-05 18:50:26 +07)" skipped: maximum number of running instances reached (1)

ошибка весьма похожа на ту, что я описал в посте #7
что не так?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB