tokio::runtime::Handle.block_on
和tokio::runtime::Runtime.block_on
有什么不同?Handle.block_on
导致一些代码挂起,而Runtime.block_on
工作正常。
这就是我创建Handle
的方式。除了最后两行之外,Runtime
是相同的。
let runtime = runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap()
.handle() // not needed for Runtime
.clone(); // ---
然后,我调用一个函数,该函数如下所示:
async fn run(){
// calls get data
}
self.runtime.block_on(run())
这是它挂起的代码。当从Runtime
运行时,它工作得很好,使用Handle
时,它在TcpStream::connect()
挂起。
async fn get_data(addr: String) -> Result<Data> {
let c = TcpStream::connect(addr.clone()).await?; // hangs here
let t = get_data_from_connect(c).await?;
return Ok(t);
}
发布于 2021-08-30 23:26:34
我通过确保Runtime
对象不会超出作用域并被删除来修复此问题。我的印象是,除了only the Runtime
object itself can之外,只需要Handle
来保持运行时的活力。
https://stackoverflow.com/questions/68986021
复制