Я пытаюсь создать приложение, которое позволит планировать и выполнять несколько длительных заданий в фоновом потоке с помощью APScheduler. Чтобы управлять расписаниями заданий и просматривать (в реальном времени) выходные данные заданий, я хочу отправлять сообщения в приложение Flask, которое работает в том же процессе (с использованием Blinker), чтобы я мог передать их веб-клиенту с помощью Flask-SocketIO.
Я придумал следующий код, но кажется, что send_log_update() вообще не вызывается. Обратите внимание, что я еще не добавил Flask-SocketIO в этот пример. Сначала я хотел убедиться, что могу общаться с приложением Flask, прежде чем еще больше усложнять ситуацию.
Разумный ли это подход? И если да: я делаю здесь что-то не так? Я не связан ни с одним из используемых решений, но мне нужно что-то вроде APScheduler для планирования заданий в определенное время (а не только с интервалами, как в этом примере).
Я рассматривал возможность использования веб-сокетов для обеспечения связи между фоновым заданием и остальной частью приложения, но это было бы слишком ненадежно. Мне приходится обрабатывать весь вывод, поступающий из фонового процесса (для отправки в сборщик журналов), а также передавать его веб-клиенту, и я хотел бы, чтобы фоновое задание было максимально независимым от любых баз данных и платформ ведения журналов.
# pip install flask apscheduler sqlalchemy blinker
from time import sleep
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.schedulers.background import BackgroundScheduler
from blinker import signal
from flask import Flask
from pytz import utc
# initialize Flask+SocketIO
app = Flask(__name__)
# signal to communicate between background thread and Flask
logsignal = signal('log')
# handle signals coming from background thread and emit them
# over the websocket
@logsignal.connect_via(app)
def send_log_update(sender, log_line, context, **extra):
# eventually I want to send this to the web client using
# Flask-SocketIO
print('received signal: ' + log_line)
# Background job that will run in the scheduler thread
def background_job():
print('starting background job')
logsignal.send('starting job')
sleep(3)
logsignal.send('job done')
# configure APScheduler
jobstores = {
'default': SQLAlchemyJobStore(url='sqlite:///scheduler.sqlite')
}
job_defaults = {
'coalesce': False,
'max_instances': 1
}
# create and start scheduler
scheduler = BackgroundScheduler(
job_defaults=job_defaults, jobstores=jobstores, timezone=utc)
if __name__ == '__main__':
scheduler.add_job(background_job, 'interval', seconds=5,
replace_existing=True, id='sample_job',
args=[])
scheduler.start()
app.run()
Подробнее здесь: https://stackoverflow.com/questions/714 ... -flask-app
Отправка сигналов из фонового потока APScheduler в приложение Flask ⇐ Python
Программы на Python
-
Anonymous
1762169847
Anonymous
Я пытаюсь создать приложение, которое позволит планировать и выполнять несколько длительных заданий в фоновом потоке с помощью APScheduler. Чтобы управлять расписаниями заданий и просматривать (в реальном времени) выходные данные заданий, я хочу отправлять сообщения в приложение Flask, которое работает в том же процессе (с использованием Blinker), чтобы я мог передать их веб-клиенту с помощью Flask-SocketIO.
Я придумал следующий код, но кажется, что send_log_update() вообще не вызывается. Обратите внимание, что я еще не добавил Flask-SocketIO в этот пример. Сначала я хотел убедиться, что могу общаться с приложением Flask, прежде чем еще больше усложнять ситуацию.
Разумный ли это подход? И если да: я делаю здесь что-то не так? Я не связан ни с одним из используемых решений, но мне нужно что-то вроде APScheduler для планирования заданий в определенное время (а не только с интервалами, как в этом примере).
Я рассматривал возможность использования веб-сокетов для обеспечения связи между фоновым заданием и остальной частью приложения, но это было бы слишком ненадежно. Мне приходится обрабатывать весь вывод, поступающий из фонового процесса (для отправки в сборщик журналов), а также передавать его веб-клиенту, и я хотел бы, чтобы фоновое задание было максимально независимым от любых баз данных и платформ ведения журналов.
# pip install flask apscheduler sqlalchemy blinker
from time import sleep
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.schedulers.background import BackgroundScheduler
from blinker import signal
from flask import Flask
from pytz import utc
# initialize Flask+SocketIO
app = Flask(__name__)
# signal to communicate between background thread and Flask
logsignal = signal('log')
# handle signals coming from background thread and emit them
# over the websocket
@logsignal.connect_via(app)
def send_log_update(sender, log_line, context, **extra):
# eventually I want to send this to the web client using
# Flask-SocketIO
print('received signal: ' + log_line)
# Background job that will run in the scheduler thread
def background_job():
print('starting background job')
logsignal.send('starting job')
sleep(3)
logsignal.send('job done')
# configure APScheduler
jobstores = {
'default': SQLAlchemyJobStore(url='sqlite:///scheduler.sqlite')
}
job_defaults = {
'coalesce': False,
'max_instances': 1
}
# create and start scheduler
scheduler = BackgroundScheduler(
job_defaults=job_defaults, jobstores=jobstores, timezone=utc)
if __name__ == '__main__':
scheduler.add_job(background_job, 'interval', seconds=5,
replace_existing=True, id='sample_job',
args=[])
scheduler.start()
app.run()
Подробнее здесь: [url]https://stackoverflow.com/questions/71455394/sending-signals-from-apscheduler-background-thread-to-flask-app[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия