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

时间:2013-11-04 01:13:08

标签: python flask zeromq pyzmq

我已经构建了一个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

1 个答案:

答案 0 :(得分:1)

问题可能是您需要在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

...