- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
NGNIX 使用 epoll 通知来了解套接字上是否有数据可供读取。
假设:有两个向服务器发出的请求。nginx 收到有关这两个请求的通知并开始:
收到第一个请求
解析ist header
检查身材( body 尺寸)
向上游服务器发送第一个请求
等等
nginx是单线程的,同一时间只能执行一项操作。
但是第二个请求会发生什么?
nginx在解析第一个请求时是否收到第二个请求?
或者在完成第一个请求后开始处理第二个请求?
或者其他我不明白的东西。
如果 1. 是正确的,那么我不明白它如何在单个线程中实现。
如果2.是正确的那么nginx怎么能这么快呢?因为 nginx 会按顺序处理所有传入请求。在任何给定时间只能处理一个请求。
请帮我理解一下。谢谢
最佳答案
Nginx 不是单线程应用程序。它不会为每个连接启动一个线程,但会在启动期间启动多个工作线程。 http://www.aosabook.org/en/nginx.html 中很好地描述了 nginx 架构。 .
实际上,单线程非阻塞应用程序是单处理器硬件最高效的设计。当我们只有一个 CPU 并且应用程序完全非阻塞时,应用程序可以充分利用 CPU 能力。非阻塞应用程序意味着应用程序不会调用任何可能等待事件的函数。所有IO操作都是异步的。这意味着应用程序不会从套接字调用简单的read()
,因为该调用可能会等到数据可用为止。非阻塞应用程序使用某种机制来通知应用程序数据可用,并且它可以调用read()
,而不会出现调用等待的风险。因此,理想的非阻塞应用程序只需要系统中的一个CPU有一个线程。由于 nginx 使用非阻塞调用,多线程中的处理没有任何意义,因为没有 CPU 来执行额外的线程。
真正的数据从网卡接收到缓冲区是在网卡发出中断时在内核中完成的。然后nginx在缓冲区中获取请求并处理它。在当前请求处理完成或当前请求处理需要可能阻塞的操作(例如磁盘读取)之前,开始处理另一个请求是没有意义的。
关于sockets - 单线程 NGINX 如何处理如此多的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950133/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!