Tokio 的 Handle::block_on 与 Runtime::block_on 有何不同?
How does Tokio's Handle::block_on differ from Runtime::block_on?
tokio::runtime::Handle.block_on
与 tokio::runtime::Runtime.block_on
有何不同? Handle.block_on
导致一些代码挂起,而 Runtime.block_on
工作正常。
这就是我创建 Handle
的方式。 Runtime
与减去最后 2 行相同。
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);
}
我通过确保 Runtime
对象不会超出范围并被删除来修复此问题。我的印象是只需要 Handle
来保持运行时活动,但 only the Runtime
object itself can.
tokio::runtime::Handle.block_on
与 tokio::runtime::Runtime.block_on
有何不同? Handle.block_on
导致一些代码挂起,而 Runtime.block_on
工作正常。
这就是我创建 Handle
的方式。 Runtime
与减去最后 2 行相同。
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);
}
我通过确保 Runtime
对象不会超出范围并被删除来修复此问题。我的印象是只需要 Handle
来保持运行时活动,但 only the Runtime
object itself can.