有没有办法在Flask服务器和它创建的线程之间共享数据(不使用globals?)

2024-10-04 11:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask服务器,它有一个metrics()端点(它是名为count_var的变量的使用者)。 Prometheus通过每10秒调用此metrics()端点来获取数据 有一个名为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()端点时,队列将为空) 我还研究了multiprocessing,但是从示例中我看到您需要启动与multiprocessing.Process共享数据的进程……我不能使用它来创建使用者,因为这是一个REST端点


Tags: run代码infoappflaskvardefcount