Rust的併發執行緒 - ibraheem
下面是一個簡單的 Web 伺服器:
use std::net::{TcpListener, TcpStream}; use std::io::{BufRead, BufReader, Write}; fn main() { let listener = TcpListener::bind("localhost:3000").expect("failed to create TCP listener"); for connection in listener.incoming() { let stream = connection.expect("client connection failed"); handle_connection(stream) } } fn handle_connection(mut stream: TcpStream) { let mut reader = BufReader::new(&mut stream); let mut request = Vec::new(); reader .read_until(b'\n', &mut request) .expect("failed to read from stream"); let request = String::from_utf8(request).expect("malformed request line"); print!("HTTP request line: {}", request); let response = concat!( "HTTP/1.1 200 OK\r\n", "Content-Length: 12\n", "Connection: close\r\n\r\n", "Hello world!" ); stream .write(response.as_bytes()) .expect("failed to write to stream"); stream.flush().expect("failed to flush stream"); } |
但是這個Web一次只能處理一個請求,我們需要能夠同時(同時)處理多個請求。為此,我們將使用多執行緒。
每個程式都從一個執行緒開始,即主執行緒。我們可以用std::thread::spawn. 因為我們希望能夠同時處理多個請求,所以我們將每個請求處理程式派生到一個新執行緒上:
fn main() { let listener = TcpListener::bind("localhost:3000").expect("failed to create TCP listener"); for connection in listener.incoming() { let stream = connection.expect("client connection failed"); std::thread::spawn(|| handle_connection(stream)); } } |
spawn函式在建立一個新執行緒後立即返回,而不是在主執行緒上執行。
透過這個簡單的更改,我們現在可以同時處理許多請求。當一個執行緒正在等待讀取、寫入或執行任何其他操作時,其他準備就緒的執行緒將被允許執行。而且由於作業系統排程程式是搶佔式的,我們的伺服器永遠不會因需要很長時間的請求而被阻塞。
這個解決方案效果很好,因為我們的伺服器是I/O bound。在我們要求從連線中讀取資料和取回資料之間,我們不一定要做任何事情。我們只是在等待,受到網路資料輸入/輸出速度的限制。一個CPU限制,另一方面應用處理器的限制,因為它不斷地做工作。讓它執行得更快的唯一方法是新增更多的 CPU 核心或將工作分配到多臺機器上。
讓我們看看伺服器現在真的快了多少!
單執行緒版本每秒能夠處理 10 個請求,平均需要 10秒來響應。另一方面,多執行緒伺服器每秒處理近 5000 個請求,延遲僅超過 100 毫秒。鑑於我們在處理程式中讓執行緒sleep了 100 毫秒,這非常好:)
相關文章
- 66.QT-執行緒併發、QTcpServer併發、QThreadPool執行緒池QT執行緒TCPServerthread
- 多執行緒併發篇——如何停止執行緒執行緒
- python基礎執行緒-管理併發執行緒Python執行緒
- Java併發(四)----執行緒執行原理Java執行緒
- Java併發(一)----程式、執行緒、並行、併發Java執行緒並行
- [Java併發]執行緒的並行等待Java執行緒並行
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- JAVA多執行緒併發Java執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- MySQL 配置InnoDB的併發執行緒MySql執行緒
- Java執行緒的併發工具類Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 執行緒 並行 與 併發 的區別執行緒並行
- nodejs 單執行緒 高併發NodeJS執行緒
- Java併發——執行緒池ThreadPoolExecutorJava執行緒thread
- Java併發系列 — 執行緒池Java執行緒
- 聊聊併發(五)——執行緒池執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- Java併發-執行緒安全的集合類Java執行緒
- 【python高併發】程序、執行緒的理解Python執行緒
- 五、併發控制(1):執行緒的互斥執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- 【高併發】深入理解執行緒的執行順序執行緒
- 多執行緒併發執行及解決方法執行緒
- 併發工具類(三)控制併發執行緒的數量 Semphore執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- 多執行緒與併發----Semaphere同步執行緒
- MySQL多執行緒併發調優MySql執行緒
- Spring如何處理執行緒併發Spring執行緒
- Java併發(十六)----執行緒八鎖Java執行緒
- 併發與多執行緒基礎執行緒
- 併發程式設計之:執行緒程式設計執行緒