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