Skip to content

Commit

Permalink
deploy: 969ed23
Browse files Browse the repository at this point in the history
  • Loading branch information
wusyong committed Aug 24, 2024
1 parent 1218bab commit bd2640a
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 4 deletions.
2 changes: 1 addition & 1 deletion ch20-02-multithreaded.html
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ <h3 id="對目前伺服器實作模擬緩慢的請求"><a class="header" href="#
<p>我們有好幾種方式能避免緩慢請求造成的請求堆積。其中一種就是我們要實作的執行緒池(thread pool)。</p>
<h3 id="透過執行緒池改善吞吐量"><a class="header" href="#透過執行緒池改善吞吐量">透過執行緒池改善吞吐量</a></h3>
<p><strong>執行緒池</strong>(thread pool)會產生一群執行緒來等待並隨時準備好處理任務。當程式收到新任務時,它會將此任務分配給執行緒池其中一條執行緒,然後該執行緒就會處理該任務。池中剩餘的執行緒在第一條執行緒處理任務時,仍能隨時處理任何其他來臨的任務。當第一條執行緒處理完成時,他會回到閒置執行緒池之中,等待處理新的任務。執行緒池讓你能並行處理連線,增加伺服器的吞吐量。</p>
<p>我們會限制執行緒池的數量為少量的數量就好,以避免我們造成阻斷服務(Denial of Service,DOS)攻擊。如果我們的程式每次遇到新的請求時就產生新的執行緒,某個人就可以產生一千萬個請求至我們的伺服器,來破壞並用光我們伺服器的資源,並導致所有請求的處理都被擱置。</p>
<p>我們會限制執行緒池的數量為少量的數量就好,以避免我們遭受阻斷服務(Denial of Service,DOS)攻擊。如果我們的程式每次遇到新的請求時就產生新的執行緒,某個人就可以產生一千萬個請求至我們的伺服器,來破壞並用光我們伺服器的資源,並導致所有請求的處理都被擱置。</p>
<p>所以與其產生無限制的執行緒,我們會有個固定數量的執行緒在池中等待。當有請求來臨時,它們會被送至池中處理。此池會維護一個接收請求的佇列(queue)。每個執行緒會從此佇列彈出一個請求、處理該請求然後再繼續向佇列索取下一個請求。有了此設計,我們就可以同時處理 <code>N</code> 個請求,其中 <code>N</code> 就是執行緒的數量。如果每個執行緒都負責到需要長時間處理的請求,隨後的請求還是會阻塞佇列,但是我們至少增加了能夠同時處理長時間請求的數量。</p>
<p>此技巧只是其中一種改善網頁伺服器吞吐量的方式而已。其他你可能會探索到的選項還有 <strong>fork/join 模型</strong><strong>單執行緒非同步模型</strong><strong>多執行緒非同步模型</strong>。如果你對此議題有興趣,你可以閱讀其他解決方案,並嘗試實作到 Rust 中。像 Rust 這種低階語言,這些所有選項都是可能的。</p>
<p>在我們開始實作執行緒池之前,讓我們討論一下使用該池會是什麼樣子。當你嘗試設計程式碼時,先寫出使用者的介面能協助引導你的設計。寫出程式碼的 API,使其能以你所期望的方式呼叫,然後在該結構內實作功能,而不是先實作功能再設計公開 API。</p>
Expand Down
2 changes: 1 addition & 1 deletion print.html
Original file line number Diff line number Diff line change
Expand Up @@ -17055,7 +17055,7 @@ <h3 id="對目前伺服器實作模擬緩慢的請求"><a class="header" href="#
<p>我們有好幾種方式能避免緩慢請求造成的請求堆積。其中一種就是我們要實作的執行緒池(thread pool)。</p>
<h3 id="透過執行緒池改善吞吐量"><a class="header" href="#透過執行緒池改善吞吐量">透過執行緒池改善吞吐量</a></h3>
<p><strong>執行緒池</strong>(thread pool)會產生一群執行緒來等待並隨時準備好處理任務。當程式收到新任務時,它會將此任務分配給執行緒池其中一條執行緒,然後該執行緒就會處理該任務。池中剩餘的執行緒在第一條執行緒處理任務時,仍能隨時處理任何其他來臨的任務。當第一條執行緒處理完成時,他會回到閒置執行緒池之中,等待處理新的任務。執行緒池讓你能並行處理連線,增加伺服器的吞吐量。</p>
<p>我們會限制執行緒池的數量為少量的數量就好,以避免我們造成阻斷服務(Denial of Service,DOS)攻擊。如果我們的程式每次遇到新的請求時就產生新的執行緒,某個人就可以產生一千萬個請求至我們的伺服器,來破壞並用光我們伺服器的資源,並導致所有請求的處理都被擱置。</p>
<p>我們會限制執行緒池的數量為少量的數量就好,以避免我們遭受阻斷服務(Denial of Service,DOS)攻擊。如果我們的程式每次遇到新的請求時就產生新的執行緒,某個人就可以產生一千萬個請求至我們的伺服器,來破壞並用光我們伺服器的資源,並導致所有請求的處理都被擱置。</p>
<p>所以與其產生無限制的執行緒,我們會有個固定數量的執行緒在池中等待。當有請求來臨時,它們會被送至池中處理。此池會維護一個接收請求的佇列(queue)。每個執行緒會從此佇列彈出一個請求、處理該請求然後再繼續向佇列索取下一個請求。有了此設計,我們就可以同時處理 <code>N</code> 個請求,其中 <code>N</code> 就是執行緒的數量。如果每個執行緒都負責到需要長時間處理的請求,隨後的請求還是會阻塞佇列,但是我們至少增加了能夠同時處理長時間請求的數量。</p>
<p>此技巧只是其中一種改善網頁伺服器吞吐量的方式而已。其他你可能會探索到的選項還有 <strong>fork/join 模型</strong>、<strong>單執行緒非同步模型</strong>或<strong>多執行緒非同步模型</strong>。如果你對此議題有興趣,你可以閱讀其他解決方案,並嘗試實作到 Rust 中。像 Rust 這種低階語言,這些所有選項都是可能的。</p>
<p>在我們開始實作執行緒池之前,讓我們討論一下使用該池會是什麼樣子。當你嘗試設計程式碼時,先寫出使用者的介面能協助引導你的設計。寫出程式碼的 API,使其能以你所期望的方式呼叫,然後在該結構內實作功能,而不是先實作功能再設計公開 API。</p>
Expand Down
2 changes: 1 addition & 1 deletion searchindex.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion searchindex.json

Large diffs are not rendered by default.

0 comments on commit bd2640a

Please sign in to comment.