如何在线程之间共享处理程序?

时间:2016-10-05 07:10:51

标签: multithreading rust

我正在编写一个多线程的Web服务器,基本上我需要在服务器启动时跨多个线程复制一个Vec<Handler>用户提供的处理程序对象。我尝试了几种方法:

1)使用fn process(&mut self, Request) -> Response方法将Handler定义为特征。用户将为每个处理程序结构实现它。这种方法在C ++或python等语言中非常常见。问题是生锈不允许我复制或克隆特征对象,因为这意味着特征对象上禁止Sized绑定它。

2)将Handler定义为Box<FnMut(Request) -> Response>。这不起作用,因为闭包不可复制。

3)我可以在线程之间共享相同的对象,但这对我来说没什么意义,因为我需要一个互斥体,当我实际上只需要跨线程的单独副本时会引入无用的争用。

如何正确实施?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是请求用户定义克隆方法。

trait Handler {
    fn process(&mut self, r: Request) -> Response;
    fn duplicate(&self) -> Box<Handler>;
}

然后您可以轻松复制Vec<Box<Handler>>