龙卷风中的并发性是否可行?

时间:2012-06-09 15:08:26

标签: python concurrency wsgi tornado

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

您的问题的答案实际上取决于这些计算绑定线程的运行时间。如果它们短时间运行,并且处理它们的速度至少与它们到达的速率相匹配,那么龙卷风就可以了。它确实是单线程的,但它确实可以很好地扩展。

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

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