我是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()
但即使是上面的代码也无效。然后我虽然使用缓存作为共享变量,但它不是实现共享队列的正确方法(我的最终目标)。请给我你的建议
答案 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函数将创建一个同名的局部变量。Response
对象。我使用jsonify()
更正了此问题,将dict转换为JSON字符串。但请注意,这种创建共享值的方式并不健全。特别要注意的是,如果您在创建多个进程的Web服务器下运行此应用程序,则每个进程都将拥有自己的count
值副本。
如果您需要在生产服务器上执行此操作,我建议您使用数据库来存储您的共享值。