【发布时间】:2014-08-19 17:26:05
【问题描述】:
我对Tornado只有一点了解,在部署的时候,最好用Nginx作为负载均衡器,配合Tornado进程的数量。
Twisted 怎么样?是不是也一样?
【问题讨论】:
我对Tornado只有一点了解,在部署的时候,最好用Nginx作为负载均衡器,配合Tornado进程的数量。
Twisted 怎么样?是不是也一样?
【问题讨论】:
如果我没有正确地跟踪您的问题,您似乎在问:“Tornado 是否应该使用 Nginx 作为前端,Twisted 怎么样?”
如果这确实是问题所在,那么它会得到一个“取决于”的答案,但可能是以一种你可能没想到的方式。 在运行时的意义上,twisted、tornado 和 Nginx在很多方面都不是同一件事。
这三个系统都在其核心中使用相同的编程模式。 OO 人称之为 Reactor 模式,通常也称为异步 I/O 事件编程,而老式 Unix 人称之为 select 风格的事件循环。 (通过select/epoll/kqueue/WaitForMultipleObjects/等完成)
Twisted 在灵活性方面表现出色。如果您需要将许多 IO 类型粘合在一起,特别是如果您想将 IO 连接到 Web,那就太棒了。如 remudada 回答中所述,它还内置了应用程序工具 (twistd)。
作为一个异步 I/O 框架,Twisted 的周转时间很少。虽然作为一个web 框架(虽然它正在积极地继续发展),但与 Flask 这样的插件丰富的框架相比,它明显落后于曲线,而且 Tornado 肯定比 Twisted Web 有许多 web 便利。
Tornado 核心在逻辑上几乎与 Twisted 的核心匹配。这些项目的核心非常相似,因此在现代版本中,您可以运行 Twisted inside of Tornado 或运行 Tornado port inside of Twisted。
Tornado 一心一意地专注于快速提供网页/网络应用程序。在大多数应用程序中,它会比 Twisted Web 快 20%,但远没有支持其他异步 I/O 使用那么灵活。它(就像twisted)仍然是基于python的,所以如果给定的webapp做了太多基于CPU的工作,它的性能会很快下降。
当人们比较 Python 和 C 时,他们经常说 Python 慢了 1.2 到 100 倍。然而,在 Reactor 模式中(如果做得好,大部分时间都花在操作系统上)语言的低效率被最小化了——只要在反应器之外没有太多的逻辑发生。
我没有确凿的数据来支持这一点,但我的期望是你会发现最简单的“Hello world”(IE 服务静态测试)在 Tornado 上的运行速度比在 Nginx 上的速度不超过 50%(使用 Twisted Web平均比 Tornado 慢 20%)。
您问“最好使用 Nginx 作为负载均衡器与 Tornado 进程的数量”,所以要回答这个问题,我需要问你一个问题。
您的部署方式是否对您采用多核技术至关重要?
为了换取惊人的异步 IO 速度,Reactor 模式有一个弱点:
正如您可能猜到的那样,该弱点的另一面是 Reactor 模式非常有效地使用该核心,如果您有负载,应该能够将该核心接近 100% 使用。
这又回到了您所询问的设计类型,但这个答案中所有背景的原因是因为这些服务的分层(Tornado 或 Twisted 前面的 Nginx)应该只采取多核机器的优势。
如果您在单核系统(最低级别的云服务器或像 Raspberry Pi 之类的嵌入式平台)上运行,则不应将反应器置于前端。这样做只会减慢整个系统的速度。
如果您运行的反应堆服务比 CPU 内核更多(负载重),那么您也会对自己不利。
所以:
【讨论】:
Twisted 本身就是一个足够好的应用服务器,我宁愿直接使用它(不像 Tornado)
如果你看官方指南http://twistedmatrix.com/documents/11.1.0/core/howto/application.html
你可以看到它是如何设置的。当然你可以使用 twsited 的 uwsgi / nginx / Emperor,因为它可以作为标准应用程序运行,但我建议你在真正需要扩展和负载平衡时这样做。
【讨论】: