何时以及如何使用 Tornado?啥时候没用?

Posted

技术标签:

【中文标题】何时以及如何使用 Tornado?啥时候没用?【英文标题】:When and how to use Tornado? When is it useless?何时以及如何使用 Tornado?什么时候没用? 【发布时间】:2011-05-11 21:41:21 【问题描述】:

好的,Tornado 是非阻塞的,速度非常快,它可以轻松处理大量常规请求。

但我想这不是灵丹妙药,如果我们只是盲目地运行基于 Django 的网站或使用 Tornado 的任何其他网站,它不会带来任何性能提升。

我找不到对此的全面解释,所以我在这里问:

什么时候应该使用 Tornado? 什么时候没用? 使用时,应该注意什么? 我们如何使用 Tornado 使网站效率低下? 有一个服务器和一个网络框架。 我们什么时候应该使用框架,什么时候可以用其他框架替换它?

【问题讨论】:

【参考方案1】:

有一个服务器和一个网络框架。我们什么时候应该使用框架,什么时候可以用其他框架替换它?

这种区别有点模糊。如果您只提供静态页面,您将使用 lighthttpd 等快速服务器之一。否则,大多数服务器都会提供不同复杂性的框架来开发 Web 应用程序。 Tornado 是一个很好的网络框架。 Twisted 功能更强大,被认为是一个很好的网络框架。它支持很多协议。

Tornado 和 Twisted 是提供支持非阻塞、异步 Web/网络应用程序开发的框架。

什么时候应该使用 Tornado? 什么时候没用? 使用时应该注意什么?

就其本质而言,异步/非阻塞 I/O 在 I/O 密集型而非计算密集型时效果很好。大多数网络/网络应用程序都非常适合此模型。如果您的应用程序需要完成某些计算密集型任务,则必须将其委托给可以更好地处理它的其他服务。而 Tornado / Twisted 可以做 web 服务器的工作,响应 web 请求。

我们如何使用 Tornado 制作低效网站?

    做任何计算密集型任务 引入阻塞操作

但我想这不是灵丹妙药,如果我们只是盲目地运行基于 Django 的网站或使用 Tornado 的任何其他网站,它不会带来任何性能提升。

性能通常是完整的 Web 应用程序架构的一个特征。如果应用程序设计不当,您可能会降低大多数 Web 框架的性能。考虑缓存、负载平衡等。

Tornado 和 Twisted 提供了合理的性能,它们非常适合构建高性能的 Web 应用程序。您可以查看扭曲和龙卷风的推荐,了解它们的能力。

【讨论】:

感谢您的回答。只是想澄清一些观点:我可以使用 Flask 或 Django bihind Tornado 并在不更改应用程序代码的情况下获得它的所有好处(如果我不做任何露营任务)吗? 如果是 - 与使用 Flup 运行 say 相比会有什么不同?谢谢。 我想在 Tornado 应用程序中解析 RSS 提要。你会认为计算量相当大吗?【参考方案2】:

很抱歉回答了一个老问题,但我遇到了这个问题,想知道为什么它没有更多答案。回答 Bart J 的问题:

我想在 Tornado 应用程序中解析 RSS 提要。你会认为这是相当计算密集的吗?

这取决于您正在执行哪种解析以及使用什么硬件 :) 时间很长,所以如果您的应用需要半秒以上的时间来响应,它会显得迟缓 - 分析您的应用程序。

快速系统的关键是出色的架构,而不是具体细节,例如您使用的框架(Twisted、Tornado、Apache+php)。 Tornado 具有异步处理风格,在我看来,这确实是很多事情的原因。 Node.js、Twisted 和 Yaws 是其他异步 Web 服务器的示例,由于采用轻量级方法和异步处理风格,因此可以很好地扩展。

所以:

什么时候应该使用 Tornado?

什么时候没用?

Tornado 非常适合处理大量连接,因为它可以响应传入的客户端、分派请求处理程序并且在将结果回调推送到事件队列之前不考虑该客户端。因此,当您想在处理大量请求时很好地扩展时,应该使用特定质量的 Tornado。 异步处理有助于功能解耦和无共享数据访问。这与REST 或其他Service Oriented Architectures 这样的无状态设计非常吻合。您也不必处理产生过多线程或进程的固有开销,并且可以省去一些锁定/IPC 麻烦。

另一方面,如果您的后端和/或数据存储需要很长时间来处理请求,Tornado 不会产生太大影响。它有助于进行并发设计,尤其是 Web 服务。并发架构可以更轻松地扩展您的设计并保持低耦合。至少这是我对 Tornado 的体验。

【讨论】:

如果您的服务中确实很少有计算密集型操作(例如 >1 秒)怎么办?是否仍然可以以非阻塞方式进行这种处理? @tigeronk2 是的,但您必须在另一个线程/进程中运行计算。 或者可能将密集进程作为另一个服务运行,以实现可伸缩性和分离,与管理另一个进程相比,开销很小。查看面向服务的架构链接。 解析 RSS 几乎按照定义不是繁重的处理,除非你做的非常非常错误。

以上是关于何时以及如何使用 Tornado?啥时候没用?的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道何时索引列以及使用啥索引?

我应该将前端代码放在我的后端项目中的啥位置以及如何/何时运行它?

Grunt、Gulp.js 和 Bower 有啥区别?为啥以及何时使用它们?

sys.intern() 做啥以及何时使用?

MySQL中的`unsigned`是啥意思以及何时使用它?

Java 泛型类型擦除:何时以及发生啥?