【发布时间】:2016-10-15 23:38:06
【问题描述】:
Hyper 具有以下 example 的 Handler 实现 Sync:
use std::sync::Mutex;
use std::sync::mpsc::{channel, Sender};
use hyper::server::{Handler, Server, Request, Response};
struct SenderHandler {
sender: Mutex<Sender<&'static str>>
}
impl Handler for SenderHandler {
fn handle(&self, req: Request, res: Response) {
self.sender.lock().unwrap().send("start").unwrap();
}
}
并声明Handler 必须实现Sync,因为Handler 可以从不同的线程中调用。
对我来说,这听起来像是不必要的性能损失。我更愿意为每个线程设置一个SenderHandler,每个线程都是独立的,这样就不需要实现Sync。
我是否误解了 Hyper,Rust 的类型系统,或者这不可能?
【问题讨论】:
-
在提供的示例中,我很想删除保护
Sender的Mutex,因为Sender已经为无锁线程内消息传递而设计。它只需要每个线程一个clone。 -
经过几分钟的思考,我倾向于同意你的看法。克隆处理程序会更强大,因为您还可以通过在处理程序中使用单个
Arc<OldBehaviorHandler>来模拟旧行为。反过来就没那么容易了……(据我现在所见)
标签: multithreading rust hyper