【问题标题】:Is concurrency possible in tornado?龙卷风中可以并发吗?
【发布时间】:2012-06-13 07:03:15
【问题描述】:

我知道 tornado 是一个单线程和非阻塞服务器,因此请求是按顺序处理的(使用事件驱动方法进行 IO 操作时除外)。

有没有办法在 tornado 中并行处理多个请求以进行正常(非 IO)执行。我不能 fork 多个进程,因为我需要一个跨请求的公共内存空间。

如果不可能,请向我推荐其他可以处理并行请求并且还支持 wsgi 的 python 服务器。

【问题讨论】:

    标签: python concurrency wsgi tornado


    【解决方案1】:

    如果您真的要同时处理多个计算绑定的请求,并且希望在 Python 中完成,那么您需要一个多进程服务器,而不是多线程服务器。 CPython 具有全局解释器锁 (GIL),可防止多个线程同时执行 python 字节码。

    大多数 Web 应用程序只进行很少的计算,而是等待来自数据库、磁盘或其他服务器上的服务的 I/O。确保在丢弃 Tornado 之前需要处理计算绑定请求。

    【讨论】:

      【解决方案2】:

      您的问题的答案实际上取决于这些受计算限制的线程将运行多长时间。如果它们运行时间很短,并且处理它们的速度至少与它们到达的速度相匹配,那么 Tornado 就可以了。它是真正的单线程,但扩展性非常好。

      如果您的计算绑定请求长时间运行,那么使用线程服务器不一定有帮助,因为正如 Ned Batchelder 已经指出的那样,GIL 将成为瓶颈。

      如果您能够放宽在所有请求中拥有相同内存空间的限制,那么您可以考虑使用 PyZMQ 运行 Tornado,因为它提供了一种运行多个 Tornado 后端的方法,前端由一个 Tornado实例。这使您可以继续将 Tornado 用于整个解决方案。有关详细信息,请参阅 PyZMQ 的 web.zmqweb 模块。

      【讨论】:

      • 感谢您的回复。我不知道 GIL。所以我无法在 CPython 中使用线程进行并行处理,我必须使用多进程。
      • 您可以在 Python 中进行并行处理,但您不会利用所有资源,因为在运行 Python 代码时您只会使用 1 个 CPU pr Python 进程。因此,您可以使用线程进行并发,但可用的性能增益有一定的限制。但很多时候 Tornado 会等待 I/O,因此添加线程可以带来很多好处。
      • zmqweb 已从 PyZMQ 中提取到自己的项目中:github.com/ellisonbg/zmqweb
      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多