面试题答案
一键面试1. 原理
在Rust的CSP模型中,通道(channel)是实现进程间通信的核心机制。我们可以创建两个通道,一个用于客户端向服务器发送请求,另一个用于服务器向客户端返回响应。客户端将请求发送到请求通道,服务器从该通道接收请求并处理,然后将响应发送到响应通道,客户端再从响应通道接收响应。
2. 关键代码示例
use std::sync::mpsc::{channel, Receiver, Sender};
use std::thread;
fn main() {
// 创建请求通道和响应通道
let (tx_request, rx_request): (Sender<String>, Receiver<String>) = channel();
let (tx_response, rx_response): (Sender<String>, Receiver<String>) = channel();
// 启动服务器线程
thread::spawn(move || {
loop {
// 服务器接收请求
let request = rx_request.recv().unwrap();
// 处理请求,这里简单地返回请求的反转字符串
let response = request.chars().rev().collect::<String>();
// 服务器发送响应
tx_response.send(response).unwrap();
}
});
// 客户端发送请求
tx_request.send("hello".to_string()).unwrap();
// 客户端接收响应
let response = rx_response.recv().unwrap();
println!("Client received: {}", response);
}
3. 代码解释
- 通道创建:
let (tx_request, rx_request): (Sender<String>, Receiver<String>) = channel();
创建了用于客户端向服务器发送请求的通道,tx_request
是发送端,rx_request
是接收端。let (tx_response, rx_response): (Sender<String>, Receiver<String>) = channel();
创建了用于服务器向客户端返回响应的通道,tx_response
是发送端,rx_response
是接收端。
- 服务器线程:
thread::spawn(move || {... })
启动一个新线程作为服务器。let request = rx_request.recv().unwrap();
服务器从请求通道接收请求,recv
方法会阻塞线程直到有请求到达。let response = request.chars().rev().collect::<String>();
这里简单地将请求字符串反转作为处理结果。tx_response.send(response).unwrap();
服务器将处理后的响应发送到响应通道。
- 客户端:
tx_request.send("hello".to_string()).unwrap();
客户端向请求通道发送请求。let response = rx_response.recv().unwrap();
客户端从响应通道接收服务器返回的响应,并打印出来。