Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 3, 2020 07:53:53

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

Приветствую всех.
Есть бот, часть своих данных для генерирования ответов получает из внешних источников и заполняет свои трехмерные списки. Установлен период актуальности данных, т.е. если прошло более заданного времени от крайнего обращения пользователя, бот выдает предупреждение и лезет наружу собирать данные, после этого выдает сгенерированный ответ.
Проблема в следующем-время на формирования своих списков бот сейчас тратит порядка 4-х минут, т.е. для пользователя после предупреждения бот 4 минуты “висит”.
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
Пробовал разные методы, но как-то пока…
Подскажите в какую сторону смотреть, должно-же существовать готовое решение?

Отредактировано ivin (Фев. 3, 2020 07:56:42)

Офлайн

#2 Фев. 3, 2020 09:52:20

lifemaker
Зарегистрирован: 2019-10-16
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

Не давать пользователю предупреждение, пока не подготовлены данные?
Забирать данные заранее до времени Х ?

Офлайн

#3 Фев. 3, 2020 11:22:51

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

еще раз..
допустим функция collector через определенный интервал занимается сбором, предварительной подготовкой и складированием данных в базу (список), этот список является как-бы кэшем данных. Другие функции постоянно обрабатывают эти данные.
каким образом запускать collector на исполнение которой требуется некоторое количество времени не останавливая основной код -работу других функций пользующихся данными сформированными collector?
не знаю, насколько правильно выразился…

з.ы. обмен через сохраненный файл со списком нежелателен.

Отредактировано ivin (Фев. 3, 2020 11:55:27)

Офлайн

#4 Фев. 3, 2020 11:38:55

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

lifemaker
Забирать данные заранее до времени Х ?
забирать данные в “фоне”

Офлайн

#5 Фев. 3, 2020 14:37:21

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

ivin
Требуется сделать работу функции обновления данных “в фоне”, т.е не заставлять пользователя ожидать обновления.
учитывая весьма общую постановку вопроса, ничего более внятного чем threading, multiprocessing или asyncio для “фонового выполнения” посоветовать сложно.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 3, 2020 14:40:47)

Офлайн

#6 Фев. 3, 2020 15:50:10

lifemaker
Зарегистрирован: 2019-10-16
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

Добавьте себе планировщик apscheduler; обратите внимание на классы BackgroundScheduler, IntervalTrigger

Офлайн

#7 Фев. 3, 2020 17:29:10

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

вот по 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 (Фев. 5, 2020 14:18:56)

Офлайн

#8 Фев. 4, 2020 10:36:02

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

по BackgroundScheduler..
поясните что там работает в фоне? сам планировщик, функция которую он дергает или то и другое?

Офлайн

#9 Фев. 4, 2020 10:44:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

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
и то и другое.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Фев. 5, 2020 14:10:44

ivin
Зарегистрирован: 2020-01-23
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с "фонофым" потоком или процессом или еще как это называется..

сейчас тестирую вот этот пример:
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
что не так?

Отредактировано ivin (Фев. 5, 2020 15:30:15)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version