Skip to main content
 首页 » 编程设计

python之从并发请求的分布式工作中发回正确的信息

2025年05月04日10kenshinobiy

我构建了一个 Flask+nginx+gunicorn 应用程序,该应用程序通过一对 zmq 套接字与服务对话,该套接字又将请求发送给分布式工作人员并取回结果。

但是,我并没有进行大量检查以查看是否将正确的信息发回给了用户。这意味着有时如果用户 A 和用户 B 几乎同时请求他们的数据,结果可能最终会发送给错误的用户。

我猜我需要在请求中发送一些上下文(比如用户名)。当结果返回时,将其放入队列并以某种方式确保浏览器请求根据上下文选择正确的结果。

您将如何确保将数据发送给其合法所有者?

代码如下所示:

@app.route('/restart', methods = ['POST']) 
def restart(): 
    uuid = request.form['uuid'] 
    msg = json.dumps({'command': 'restart', 'uuid': uuid}) 
    send_to_master(msg) 
    resp = Response(response=data, status=200, mimetype="application/json") 
    return resp 
 
def send_to_master(msg): 
    context = zmq.Context() 
    s = context.socket(zmq.PAIR) 
    s.connect("tcp://localhost:9001") 
    s.send(msg) 
 
    # result received from the service 
    data = s.recv() 
 
    s.close() 
    return data 

请您参考如下方法:

问题可能是您需要在 send_to_master 中实现锁定,以确保在您的应用程序中一次只打开一对套接字。

您可以尝试实现锁定,详见: https://stackoverflow.com/a/10181810/288425

这是一个刺,虽然我还没有测试过:

from threading import Lock 
lock = Lock() 
 
def send_to_master(msg): 
    context = zmq.Context() 
 
    with lock: 
        s = context.socket(zmq.PAIR) 
        s.connect("tcp://localhost:9001") 
        s.send(msg) 
 
        # result received from the service 
        data = s.recv() 
 
        s.close() 
 
    return data 
 
...