我有一个带有某个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查询始终只有一个进程在运行?
答案 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()
我可能在函数调用时遇到一些范围错误,但这就是一般的想法。