Python 如何确保一次只运行一个线程,即最新的数据?

Python 如何确保一次只运行一个线程,即最新的数据?,python,multithreading,flask,Python,Multithreading,Flask,我有一个Flask应用程序,它有一个特定的URL路由,当被调用时,会通过线程库调用进程内的函数。此函数包含一个while True循环,该循环内部有一个DB查询 同样的函数可以再次调用,但是数据库可能会改变,这会导致不同的线程。但是,我不希望这样,因为这会导致线程具有旧数据 我想要一根线 以下是我目前的做法: @mod.route('/api/start-zmq-listener') def startZMQListener(): try: thread = thread

我有一个Flask应用程序,它有一个特定的URL路由,当被调用时,会通过线程库调用进程内的函数。此函数包含一个while True循环,该循环内部有一个DB查询

同样的函数可以再次调用,但是数据库可能会改变,这会导致不同的线程。但是,我不希望这样,因为这会导致线程具有旧数据

我想要一根线

以下是我目前的做法:

@mod.route('/api/start-zmq-listener')
def startZMQListener():
    try:
        thread = threading.Thread(target=enableZMQ, name="enableZMQ", kwargs={
            'username': 'test',
            'stopFlag': stopFlag
        })
        thread.start()
        return success_response('ok')

    except Exception as e:
        return error_response(e)


def enableZMQ(username, stopFlag):
    if not stopFlag:
        context = zmq.Context()

        listen_on = 'tcp://' + ENGINE_IP 

        sock = context.socket(zmq.SUB)
        sock.setsockopt(zmq.SUBSCRIBE, b"")
        sock.connect(listen_on)
        print ('listening on ' + listen_on)

        while True:
            print MONGODB QUERY
假设“MONGODB查询”每次都是相同的,但它查询的数据不同


如何确保始终只有一个进程使用最新的MongoDB查询?

一个可能的解决方案是在ram中始终准备好数据

您可以在flask应用程序中有一个回调,用数据填充全局值。此回调将从另一个按间隔运行的线程调用

大概是这样的:

from threading import Thread, Lock
# Add flask stuff

global value_store = [] # Some data
global mutex = Lock()
INTERVAL = 1  # second
global should_query = False

@mod.route('/api/getSomeData')
def get_some_data():
    global mutex
    with mutex
        global value_store
        return jsonify(value_store)

def callback(data):
    global mutex 
    with mutex:
        global value_store
        value_store = data

def query_repeat():
    global should_query
    while should_query:
        # query db here
        raw data = query_database()

        # filter/process data
        data = filter_data(raw_data)

        # call callback
        callback(data)

        # sleep and repeat
        time.sleep(INTERVAL)


t = Thread(target = query_repeat, args = (,))
should_query = True
t.start()

我可能在函数调用中遇到一些作用域错误,但这是一般的想法。

我认为您需要的是一个单例。@iamkhush您介意分享更多细节吗?