如何使用python flask共享队列Restful Web服务

时间:2013-11-24 05:40:04

标签: python rest flask

我是python flask REST Web服务的新手。我正在尝试开发一个具有共享队列的休息Web服务,多个线程将不断写入服务器端的该队列,最后当用户调用GET方法时,该服务应返回共享队列中的第一个项目。

我试图通过首先实现共享变量来开始开发它,以下是我使用的代码,

from flask import Flask
app = Flask(__name__)

count= 0 #Shared Variable

@app.route("/")
def counter():
    count = count+1
    return {'count':count}

if __name__ == "__main__":

    app.run() 

但即使是上面的代码也无效。然后我虽然使用缓存作为共享变量,但它不是实现共享队列的正确方法(我的最终目标)。请给我你的建议

2 个答案:

答案 0 :(得分:6)

你想要做的事情比这更复杂,我害怕。

Flask(和其他WSGI python系统)在单个线程中不起作用 - 它们通常需要生成多个线程和实例来处理无阻塞的请求,或者没有多个请求访问相同的“第一个任务”同时。因此,全局变量不像其他简单的单线程python脚本那样工作。

对于不同的进程,您需要一些方法来访问相同的单个数据队列。

通常,这意味着将数据队列外包给外部数据库。一个流行的选择是Redis。烧瓶和redis有一个很好的介绍:

http://flask.pocoo.org/snippets/73/

我希望这可以帮助你朝着正确的方向前进!

答案 1 :(得分:1)

您的示例中有几个错误。这是一个有效的版本:

from flask import Flask, jsonify
app = Flask(__name__)

count= 0 #Shared Variable

@app.route("/")
def counter():
    global count
    count = count+1
    return jsonify({'count':count})

if __name__ == "__main__":
    app.run()

您的版本中存在的两个问题是:

  • 您错过了在视图函数中将count声明为全局。如果没有全局声明,view函数将创建一个同名的局部变量。
  • view函数返回的响应不能是字典,它必须是字符串或Response对象。我使用jsonify()更正了此问题,将dict转换为JSON字符串。

但请注意,这种创建共享值的方式并不健全。特别要注意的是,如果您在创建多个进程的Web服务器下运行此应用程序,则每个进程都将拥有自己的count值副本。

如果您需要在生产服务器上执行此操作,我建议您使用数据库来存储您的共享值。