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

时间:2018-05-15 13:00:23

标签: python multithreading flask

我有一个带有某个URL路由的Flask应用程序,当被调用时,通过线程库调用进程内的函数。这个函数包含一个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 QUERY”每次都是一样的,但它查询的数据是不同的。

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

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是让数据始终在RAM中准备好。

您可以在烧瓶应用中使用数据填充全局值。此回调将从另一个间隔运行的线程调用。

这样的事情:

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()

我可能在函数调用时遇到一些范围错误,但这就是一般的想法。