Есть ли способ обмена данными между Flask сервером и созданным им потоком (без использования глобальных переменных?) - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть сервер Flask с конечной точкой metrics() (которая является потребителем для переменной с именем count_var). Прометей очищает данные, вызывая эту конечную точку metrics () каждые 10 с. В начале этого сервера на этом сервере создается поток с именем run_job, который начинается со следующего кода, который выполняется каждые 30 с для заполнения этого count_var Весь следующий код находится в test.py

if __name__ == '__main__':

    def run_job():
        while True:
            try:
                app.logger.info("collect metrics....")
                getMetrics() 
            except Exception as e:
                app.logger.info("Exception {}".format(e))
                pass
            time.sleep(30)
    thread = threading.Thread(target=run_job)
    thread.start()

    app.logger.info('start server')
    app.run('0.0.0.0')

У меня есть рабочий getMetrics() код, который объявляет глобальную переменную следующим образом (и переменная используется в metrics() и отображается в Prometheus правильно)

import threading
count_var = 0
app = Flask(__name__)
def getMetrics():
    global count_var
    # fill count_var here

Потребителем этого кода является конечная точка metrics ()

@app.route("/metrics", methods=['GET'])
def metrics():
    PROMCOUNT.set(count_var)
    return 
    Response(prometheus_client.generate_latest(registry), 
     mimetype=CONTENT_TYPE_LATEST)

Я хочу полностью избежать использования глобальных переменных. Я посмотрел на Очередь, чтобы разделить count_var между процессом и потоком, однако скорость, с которой производятся и потребляются данные, отличается (также getMetrics() может привести к ошибке или блокировке, а затем очередь будет пустой при вызове конечной точки metrics()) I также рассмотрел multiprocessing, но из примеров, которые я видел, необходимо запустить процессы, совместно использующие данные с multiprocessing.Process ... Я не могу использовать его для создания потребителя, поскольку это конечная точка REST

...