【问题标题】:Making Synchronous Flask Asynchronous - Flask Instances使同步 Flask 异步 - Flask 实例
【发布时间】:2017-04-11 17:59:57
【问题描述】:

通常当人们谈论“异步”或“使 Flask 异步”时,他们指的是使用一些异步工具(GEvent、asyncio 等)对 Flask 进行猴子修补的情况

考虑到 Flask 足够小,可以“动态创建”,我认为这个模型可能会起作用:

传入的 HTTP 请求 -> HTTP 服务器(例如 nginx/apache) -> HTTP-request-queue -> Flask 实例(处理每个请求)

无需修改您的任何代码,执行任何猴子补丁,您基本上就可以隔离处理您的阻塞代码。经过一番挖掘,我相信可以做到:

http://flask.pocoo.org/docs/0.11/deploying/wsgi-standalone/#twisted-web][1]

我的问题是:

  1. 使用这种方法是否比编写事件驱动代码效率低? (例如,使用 GEvent 或 Tornado)

  2. [1] 处理请求的模型是什么? (是不是和我上面描述的一样)

  3. 可以存在竞争条件吗?例如。

    对首先处理最后一个 HTTP 请求 (request-2) 的数据库进行 2 次调用(由于异步请求处理),导致第一个 HTTP 请求 (request-1) 发生冲突

【问题讨论】:

    标签: python python-3.x flask twisted


    【解决方案1】:
    1. 假设“这种方法”意味着使用同步烧瓶和 wisgi 服务器,效率取决于您的应用程序做什么。如果它是一个相对较小的应用程序并且不需要太多长时间运行的任务,那么像 Gunicron + Flask 这样的应用程序是一个很好的解决方案。另一方面,如果您的应用程序有长时间运行的任务,例如向外部站点发送大量请求或等待 Celery 任务返回结果,那么我建议使用事件驱动方法 + 代理/负载均衡器。通常使用异步可以更好地处理延迟量不可预测的任何事情。

    2. 和你描述的差不多。

    3. 当然会发生 :) 这就是 Web 开发如此有趣的原因。开发人员必须非常仔细地设计,以便将此类条件保持在最低限度。

    话虽如此,我个人更喜欢 Nginx 作为 HTTP 服务器和负载均衡器 + Tornado/Twisted 的组合。如果您想使用同步或异步设计,这种设置提供了最大的灵活性而没有太多的牺牲和良好的平衡。如果你喜欢 Flask 语法,有一个很好的项目叫做klein,它结合了 Twisted 和 Werkzeug。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      相关资源
      最近更新 更多