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())
这是代码卡住的部分。如果直接在运行时中运行它则正常工作,但使用“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);
}
runtime
,从而导致运行时关闭,请尝试此代码并查看差异。 - Ömer Erden