龙卷风 vs wsgi(带gunicorn)

2024-03-22

I read this http://rz.scale-it.pl/2013/01/25/tornado___the_best_web_framework.html关于龙卷风:

另一方面,如果您已经有 WSGI 应用程序并且想要运行它 在速度极快的tornado.httpserver.HTTPServer上,将其包装为 龙卷风.wsgi.WSGIContainer。但你需要小心。自从你的 原始应用程序没有为异步服务器做好准备,并且 会进行大量的IO/计算,它会阻塞其他请求 生成响应(进一步的请求将被接受并缓冲 但排队等待稍后处理)。

金考恩说:

'用于 UNIX 的 Python WSGI HTTP 服务器。这是一个预分叉工人模型 从 Ruby 的 Unicorn 项目移植而来。

  1. 那么 Gunicorn 会生成工作进程来处理请求吗?
  2. 每个工作人员一个并发请求?
  3. 虽然龙卷风会使用epoll or kqueue在一个进程中完成工作(没有主/工作进程)?
  4. 所以如果我使用阻塞调用(比如requests.get在处理程序的 get/post 函数中),这会阻止所有请求处理还是仅阻止当前正在处理的请求?

如果您在Tornado之上运行WSGI应用程序,那么Tornado和gunicorn之间没有太大区别,只要应用程序在特定进程中处理WSGI请求,就不会发生任何其他事情。对于 Gunicorn 来说,因为它只有一个线程处理请求,而对于 Tornado 来说,因为主事件循环在这段时间内永远不会运行来处理任何并发请求。

就龙卷风而言,其实也存在一个隐患。

对于gunicorn来说,由于只有一个请求线程,所以工作进程一次只会接受一个Web请求。如果有并发请求到达服务器,它们将由任何其他可用的工作进程处理,因为它们都共享相同的侦听器套接字。

不过,对于 Tornado,WSGI 应用程序下层的异步性质意味着一个进程可以同时接受多个请求。它们最初会在读取请求标头和内容时交错,Tornado 在调用 WSGI 应用程序之前将其预先读入内存。当整个请求内容被读取后,控制权将移交给 WSGI 应用程序来处理该请求。同时,在 WSGI 应用程序处理第一个请求期间,由同一进程处理且尚未读取请求标头和内容的并发请求将被阻塞。

现在,如果您只有一个 Tornado 进程,这并不是什么大问题,因为无论如何,请求都会被序列化,但如果您使用 Gunicorn 的 Tornado 工作模式,以便使多个 Tornado 工作进程共享相同的侦听器套接字,这可以是很糟糕。这是因为异步层产生的各个进程的贪婪本质意味着,当可能有另一个工作进程可以处理请求时,请求可能会在进程中被阻塞。

总之,对于单个 Tornado Web 服务器进程,您一次只能处理一个请求。在gunicorn中,您可以拥有多个工作进程以允许同时处理请求。不过,使用 Tornado 的多进程设置可能会导致请求被阻止。

因此,Tornado 对于非常小的自定义 WSGI 应用程序来说非常有用,在这些应用程序中,它们不执行太多操作,因此响应速度非常快,但如果您在阻塞 WSGI 应用程序下运行长时间运行的请求,则它可能会受到影响。因此,Gunicorn 会更好,因为它具有处理并发请求的适当能力。由于 Gunicorn 是单线程的,并且需要多个工作进程,因此它将使用更多的内存。

因此,它们都有权衡,在某些情况下,您最好使用通过多线程和多个工作进程提供并发性的 WSGI 服务器。这允许您处理并发请求,但不会因为需要许多工作进程而导致内存使用量激增。同时,您需要平衡每个进程的线程数和使用多个进程,以免在 CPU 密集型应用程序中过度受到 GIL 的影响。

具有多线程能力的 WSGI 服务器可以选择 mod_wsgi、uWSGI 和 waitress。对于女服务员,尽管您仅限于单个工作进程。

总而言之,哪个是最好的 WSGI 服务器实际上很大程度上取决于您的 Web 应用程序的具体情况。没有任何一个 WSGI 服务器在所有方面都是最好的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

龙卷风 vs wsgi(带gunicorn) 的相关文章

  • 使用 Flask-restful RequestParser 进行嵌套验证

    使用烧瓶宁静 http flask restful readthedocs org 微框架 我在构建一个RequestParser这将验证嵌套资源 假设预期的 JSON 资源格式为 a list obj1 1 obj2 2 obj3 3 o
  • 如何以 HDF5 格式提供 caffe 多标签数据?

    我想将 caffe 与矢量标签一起使用 而不是整数 我检查了一些答案 似乎 HDF5 是更好的方法 但后来我陷入了这样的错误 precision layer cpp 34 检查失败 outer num inner num bottom 1
  • (Django) (外键问题) model.person_id 不能为 NULL

    我知道这在 Django 圈子里似乎是一个被过度询问的问题 但我不敢说我 还没有找到解决方案 我的模型 from djago import User class InfoPersonal models Model person models
  • 缺少 python 配置

    我正在安装一个程序 需要安装 python config 唯一的问题是我目前没有 python config 而且我似乎不知道如何获取它 经过搜索后 我应该可以通过以下方式安装它 yum install python devel 然而 这样
  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • 这是我尝试安装 pip3 时得到的结果

    这是我尝试安装 pip3 时得到的结果 sudo apt get install python3 pip Reading package lists Done Building dependency tree Reading state i
  • Django url 模式 - 带正斜杠的参数

    如何为两个参数创建 url 模式 其中第一个参数包含正斜杠作为其内容的一部分 da ta1 data2 最初我有以下模式 r view P
  • VSCode Jupyter Notebook - 恢复缓存版本

    我正在使用在 Ubuntu 19 10 上运行的 VSCode v 1 48 0 创建一个 Jupyter Notebook VSCode 崩溃了 不幸的是我没有保存笔记本 当我重新启动时它是空的 我已经能够在 config Code Us
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • Python、cPickle、酸洗 lambda 函数

    我必须像这样腌制一组对象 import cPickle as pickle from numpy import sin cos array tmp lambda x sin x cos x test array tmp tmp tmp tm
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 使用 Beautifulsoup 解析时保持 XML 文件的缩进

    我正在使用 BS4 解析 XML 文件并尝试将其写回新的 XML 文件 输入文件
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 使用 pythons strftime 显示日期,例如“5 月 5 日”? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 日期顺序输出 https stackoverflow com questions 739241 python date ordinal output 在Python中 time strf
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • 使用 PIL 合并图像时模式不匹配

    我正在传递 jpg 文件的名称 def split image into bands filename img Image open filename data img getdata red d 0 0 0 for d in data L
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下
  • 用于获取有关 SVN 存储库信息的 Python 库?

    我正在寻找一个可以从 SVN 存储库中提取 至少 以下信息的库 not工作副本 修订号及其作者和提交消息 每个修订版中的更改 添加 删除 修改文件 有Python库可以做到这一点吗 对于作者和提交消息 我可以解析 db revprops 0

随机推荐

  • 通过 HTTPS 的 Ember CLI 服务器

    是否可以在 Ember 的 CLI 服务器上启用 HTTPS 协议 我们的公司 OAuth 系统只允许通过 HTTPS 进行重定向 因此如果没有这个系统 我就会陷入困境 请注意 从 ember cli 0 2 6 开始 您的应用程序可以通过
  • Android:根据屏幕尺寸限制活动方向

    我有一个应用程序 在大屏幕或超大屏幕尺寸的任一方向上看起来都不错 但在手机上应该仅限于纵向 我知道您可以限制清单中活动的方向 但是有没有办法有条件地这样做 或者我可以在活动本身中设置某种属性来选择支持哪些方向 这是我在我的应用程序中使用的解
  • 如何查找 ArrayList 中的最小值以及索引号? (爪哇)

    我需要获取 Java 数组列表中最小值的索引值 我的数组列表包含多个浮点数 我正在尝试想出一种方法来获取最小浮点数的索引号 这样我就可以在代码中的其他地方使用该索引号 我是个初学者 所以请不要讨厌我 谢谢 您可以使用集合 min http
  • req.session.passport 和 req.user Blank ,并且 req.isAuthenticated 在使用 Passport-facebook 首次成功登录后返回 false

    从 Facebook 初始成功登录并使用 Passport facebook 1 0 3 和 Express 4 6 1 进行登录重定向回调后 req session passport 和 req user 包含序列化调用期间设置的值 我从
  • 使用 fancyBox 的 HTML 属性 rel 错误

    我正在使用 fancyBox 创建一个画廊 代码如下 a class fancybox href img work 1 jpg a a class fancybox href img work 2 jpg a a class fancybo
  • Postgresql ON sqlalchemy 中的冲突

    我读过很多资源 ao 1 https bitbucket org zzzeek sqlalchemy issues 3529 support postgres 95 on conflict upserts 2 https stackover
  • 在闪亮的主面板中右对齐元素

    我有一个闪亮的应用程序 左侧有一个侧边栏 我想将 mainPanel 中的绘图向右对齐 我尝试过添加style align right mainPanel 中的每个元素 以及包装我能想到的所有内容div style align right
  • 适用于嵌入式设备的良好串行通信协议/堆栈? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在为各种项目编写了几个不同的自定义串行协议后 我开始对每次重新发明轮子感到沮丧 我一直在寻找更通用的解
  • Powershell Invoke-Sqlcmd 登录失败

    我正在尝试从 Windows SQL Server 2008 R2 的 powershell 运行 sql 查询 代码似乎无法通过 SQL Server 身份验证凭据来正确运行 sqlcmd 我直接从 powershell 运行第一部分 而
  • ExtJS AJAX 另存为对话框

    我发出 ExtJS AJAX 请求 并且希望向用户显示标准浏览器 另存为 对话框 要下载的文件可以是 pdf jpg 或 png 文件 目前 AJAX 请求已成功提交 但由于它是异步的 因此不会出现对话框 我可以简单地不使用 AJAX 但是
  • udp数据包被tcpdump捕获,但没有被套接字接收[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我编写了一个 rawudp 程序 通过原始套接字发送 udp 数据包 按照网页http www tenouk com Module43a html h
  • 使用 Zend Framework 渲染站点范围元素的最佳方法

    我正在使用 模块 前端控制器资源进行项目设置 渲染站点范围元素 例如导航 的最佳方法是什么 Add the action which renders the element to the end of the action stack ea
  • 无法从 virtualenv 导入包

    我的项目中有一个一行脚本 它导入一个包 flask mail 我在 virtualenv 中运行它 如果我执行python script py I get ImportError No module named flask mail 如果在
  • 无法将映像推送到配置为代理缓存的 docker 注册表

    我跟着this http blog docker com 2015 10 registry proxy cache docker open source 设置 Docker v2 注册表作为 Docker Hub 映像的本地代理缓存的指南
  • git中的用户访问控制

    我有一个简单的问题 我们使用 Bitbucket 作为 git 提供者 假设我是一个开发团队的经理 我希望自己成为唯一可以将代码合并到 master 分支的人 其他团队成员可以签出主分支并创建新分支 但他们无法将代码合并到主分支 我怎样才能
  • 将 pandas 数据框转换为列表

    我有一个熊猫数据框 apple banana carrot diet coke 1 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 0 我想将其转换为以下内容 apple banana carrot
  • 如何重置 iOS 9 通用链接设置?

    在我的 iOS 9 应用程序上测试通用链接时 我不小心点击了 mywebsite com gt 右上角 这使得应用程序再次导航到网站 现在我似乎无法再次使通用链接起作用 似乎 iOS 已经记住了我的偏好 即我希望看到在 Safari 而不是
  • SQL Server 中的 DateTime2 与 DateTime

    哪一个 datetime https msdn microsoft com en us library ms187819 aspx datetime2 https msdn microsoft com en us library bb677
  • 撰写:LazyColumn 在单个项目更新时重组所有项目

    我正在尝试使用 LazyColumn 在列表中显示订单列表 这是代码 Composable private fun MyOrders orders List
  • 龙卷风 vs wsgi(带gunicorn)

    I read this http rz scale it pl 2013 01 25 tornado the best web framework html关于龙卷风 另一方面 如果您已经有 WSGI 应用程序并且想要运行它 在速度极快的t