Отправка сигналов из фонового потока APScheduler в приложение FlaskPython

Программы на Python
Ответить
Anonymous
 Отправка сигналов из фонового потока APScheduler в приложение Flask

Сообщение 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()


Подробнее здесь: https://stackoverflow.com/questions/714 ... -flask-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»