Есть ли способ запустить функцию фляги Python, каждый конкретный интервал времени и выводить на локальный сервер вывод? - PullRequest
0 голосов
/ 30 марта 2019

Я работаю в программе на Python, используя колбу, где я хочу извлечь ключи из словаря. эти ключи в текстовом формате. Но я хочу повторить этот процесс над каждым конкретным интервалом времени. И отображать этот вывод в локальном браузере каждый раз

Я пробовал это с помощью flask_apscheduler. Программа запускается и показывает результат, но только один раз, но не повторяется через определенный промежуток времени.

Это программа на Python, которую я попробовал.

@app.route('/trend', methods=['POST', 'GET'])
def run_tasks():
    for i in range(0, 1):
        app.apscheduler.add_job(func=getTrendingEntities, trigger='cron', args=[i], id='j'+str(i), second = 5)

    return "Code run perfect"

@app.route('/loc', methods=['POST', 'GET'])
def getIntentAndSummary(self, request):

    if request.method == "POST":

        reqStr = request.data.decode("utf-8", "strict")
        reqStrArr = reqStr.split()
        reqStr = ' '.join(reqStrArr)
        text_1 = []
        requestBody = json.loads(reqStr)
        if requestBody.get('m') is not None:
                text_1.append(requestBody.get('m'))
        return jsonify(text_1)

if (__name__ == "__main__"):
    app.run(port = 8000)

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Я бы порекомендовал вам запустить демонизированный поток, импортировать переменную приложения, затем вы можете использовать with app.app_context() для входа в консоль.

Это немного сложнее, но позволяет запускать приложение, разделенное разными потоками.

Я использую этот метод для одновременного запуска нескольких http-запросов. Альтернативой является ожидание каждого ответа, прежде чем делать новый.

Я уверен, что вы поняли, что поток будет занят, если вы запустите бесконечно запущенную команду.

Обязательно демонизируйте поток, чтобы при остановке веб-приложения оно одновременно грациозно завершало работу потока.

0 голосов
/ 30 марта 2019

Проблема в том, что вы звоните add_job каждый раз, когда запрашивается страница /trend. Задание должно быть добавлено только один раз, как часть инициализации, перед запуском планировщика (см. Ниже).

Также имеет смысл использовать триггер 'interval' вместо 'cron', поскольку вы хотите, чтобы ваша работа выполнялась каждые 5 секунд. Вот простой рабочий пример:

from flask import Flask
from flask_apscheduler import APScheduler
import datetime

app = Flask(__name__)

#function executed by scheduled job
def my_job(text):
    print(text, str(datetime.datetime.now()))

if (__name__ == "__main__"):
    scheduler = APScheduler()
    scheduler.add_job(func=my_job, args=['job run'], trigger='interval', id='job', seconds=5)
    scheduler.start()
    app.run(port = 8000)

Пример вывода на консоль:

job run 2019-03-30 12:49:55.339020
job run 2019-03-30 12:50:00.339467
job run 2019-03-30 12:50:05.343154
job run 2019-03-30 12:50:10.343579

Затем вы можете изменить атрибуты задания, вызвав scheduler.modify_job().

Что касается второй проблемы, которая заключается в обновлении представления клиента при каждом запуске задания, вы не можете сделать это напрямую из Flask. Уродливым, но простым способом было бы добавить <meta http-equiv="refresh" content="1" > на HTML-страницу, чтобы дать браузеру команду обновлять ее каждую секунду. Гораздо лучшей реализацией было бы использование SocketIO для отправки новых данных в режиме реального времени веб-клиенту.

...