tornado 中可以并发吗?

问题描述 投票:0回答:2

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

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

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

python concurrency wsgi tornado
2个回答
10
投票

如果您确实要处理多个受计算限制的并发请求,并且您想在 Python 中执行此操作,那么您需要一个多进程服务器,而不是多线程服务器。 CPython 具有全局解释器锁 (GIL),可防止多个线程同时执行 Python 字节码。

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


5
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.