我正在编写一个多线程的Web服务器,基本上我需要在服务器启动时跨多个线程复制一个Vec<Handler>
用户提供的处理程序对象。我尝试了几种方法:
1)使用fn process(&mut self, Request) -> Response
方法将Handler定义为特征。用户将为每个处理程序结构实现它。这种方法在C ++或python等语言中非常常见。问题是生锈不允许我复制或克隆特征对象,因为这意味着特征对象上禁止Sized
绑定它。
2)将Handler定义为Box<FnMut(Request) -> Response>
。这不起作用,因为闭包不可复制。
3)我可以在线程之间共享相同的对象,但这对我来说没什么意义,因为我需要一个互斥体,当我实际上只需要跨线程的单独副本时会引入无用的争用。
如何正确实施?
答案 0 :(得分:1)
最简单的解决方案是请求用户定义克隆方法。
trait Handler {
fn process(&mut self, r: Request) -> Response;
fn duplicate(&self) -> Box<Handler>;
}
然后您可以轻松复制Vec<Box<Handler>>
。