我正在编写一个多线程网络服务器,基本上我需要复制一个 Vec<Handler>
服务器启动时跨多个线程的用户提供的处理程序对象。我尝试了几种方法:
1) 将 Handler 定义为具有 fn process(&mut self, Request) -> Response
的特征方法。用户将为每个处理程序结构实现它。这种方法在 C++ 或 Python 等语言中很常见。问题是 Rust 不允许我复制或克隆特征对象,因为这意味着 Sized
绑定(bind)在它上面,这在特征对象上是被禁止的。
2) 将处理程序定义为 Box<FnMut(Request) -> Response>
.这不起作用,因为闭包不可复制。
3) 我可以在线程之间共享相同的对象,但这对我来说意义不大,因为我需要一个互斥体,当我实际上只需要跨线程的单独副本时,它会引入无用的争用。
如何正确实现?
最佳答案
最简单的解决方案是要求用户定义克隆方法。
trait Handler {
fn process(&mut self, r: Request) -> Response;
fn duplicate(&self) -> Box<Handler>;
}
然后你可以复制你的Vec<Box<Handler>>
很容易。
关于multithreading - 如何在线程之间共享处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39867556/