【问题标题】:How to use shared queues with python flask Restful web services如何在 python flask Restful web 服务中使用共享队列
【发布时间】:2013-12-08 21:44:54
【问题描述】:

我是 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() 

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

【问题讨论】:

    标签: python rest flask


    【解决方案1】:

    恐怕你想做的事情比这复杂一点。

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

    您需要某种方式让不同的进程都访问同一个数据队列。

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

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

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

    【讨论】:

      【解决方案2】:

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

      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 声明为全局。如果没有全局声明,视图函数会创建一个同名的局部变量。
      • 视图函数返回的响应不能是字典,需要是字符串或者Response对象。我使用jsonify() 更正了这个问题,将字典转换为 JSON 字符串。

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

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

      【讨论】:

      • 如果我想实现共享队列(不是整数变量),程序是否相同?现在我正在考虑在每次获取请求后使用泡菜来存储共享队列,并通过同步块访问它。但是,如果我通过同步块授予对队列的访问权限,它将无法很好地处理并发多个请求(每个请求都必须等到它有机会进入同步块)。你怎么看 ? (我的最终目标是实现一个共享队列)
      • 再次阅读我的答案,这不是一个好的解决方案。使用数据库代替,像 Redis 这样的轻量级数据库将是一个很好的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2021-06-28
      • 2019-08-06
      • 2010-10-15
      • 2022-01-03
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多