<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Event Loop on Leanku 的博客</title><link>https://www.leanku.com/tags/event-loop/</link><description>Recent content in Event Loop on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 20 Jun 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://www.leanku.com/tags/event-loop/index.xml" rel="self" type="application/rss+xml"/><item><title>IO 多路复用：一个线程为什么可以同时处理大量 HTTP 请求？</title><link>https://www.leanku.com/post/computerscience/io-multiplexing-epoll-event-loop/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/computerscience/io-multiplexing-epoll-event-loop/</guid><description>&lt;h1 id="io-多路复用一个线程为什么可以同时处理大量-http-请求"&gt;IO 多路复用：一个线程为什么可以同时处理大量 HTTP 请求？&lt;/h1&gt;&#10;&lt;p&gt;我们知道，一个 Web 服务同时面对大量 HTTP 请求时，并不一定需要：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1000 个请求&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1000 个线程&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于 IO 密集型服务，更常见的做法是让执行单元在等待网络 IO 时不要一直阻塞，然后利用事件机制处理其他连接。&lt;/p&gt;&#10;&lt;p&gt;这就引出了一个非常重要的概念：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IO 多路复用（I/O Multiplexing）。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;它是理解 Linux 网络服务器、Nginx、Node.js、Swoole、Hyperf 等高并发网络程序的基础。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1-先从一个-socket-开始"&gt;1. 先从一个 Socket 开始&lt;/h2&gt;&#10;&lt;p&gt;一个 HTTP 服务器，本质上需要处理大量网络连接。&lt;/p&gt;&#10;&lt;p&gt;例如服务器监听：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.0.0.0:80&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端建立 TCP 连接后，操作系统会为连接提供对应的 Socket。&lt;/p&gt;&#10;&lt;p&gt;可以简单理解为：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client A ─── Socket A ──┐&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client B ─── Socket B ──┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client C ─── Socket C ──┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client D ─── Socket D ──┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Web Server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设现在有：&lt;/p&gt;</description></item></channel></rss>