如何将 impl Trait 传递给线程

问题描述 投票:0回答:1

我试图将处理程序传递给每个传入请求的线程,我尝试将其包装在 Arc 中,但出现以下错误:

参数类型

impl ConnectionHandler
可能寿命不够长

如何解决这个问题?

impl TCPConnectionHandler {
    pub async fn set_handler(&self, handler: impl ConnectionHandler) {
        let arc_handler = Arc::new(handler);
        loop {
            let handler_clone = arc_handler.clone();
            match self.0.accept().await {
                Ok((mut stream, addr)) => {
                    let join_handle = tokio::task::spawn(async move {    
                        handler_clone.on_incoming_connection(&addr);
                     // ^^^^^^^^^^^^^   
                     // ❌ the parameter type `impl ConnectionHandler` may not live long enough
                    });
                }
                Err(_) => {
                    panic!("Error accepting connection")
                }
            }
        }
    }
}
multithreading rust concurrency rust-tokio ownership
1个回答
1
投票

仅仅因为您将值包装在

Arc
中并不意味着它仍然不能包含非静态引用。

例如,您可以有一个类型,

MyCoolConnectionHandler<'a>
,其中包含引用。类型
Arc<
MyCoolConnectionHandler<'a>
>
仍然包含引用。

如果您的

ConnectionHandler
实现确实 not 包含引用,则需要告诉编译器它可以通过将其限制为
'static
生命周期来做出该假设:

pub async fn set_handler(&self, handler: impl ConnectionHandler + 'static) {
   // ...
}

您可能会发现

Arc
现在变得不必要了。

© www.soinside.com 2019 - 2024. All rights reserved.