gpt4 book ai didi

rust - 新的Tokio +对旧版Hyper的依赖

转载 作者:行者123 更新时间:2023-12-03 11:43:28 27 4
gpt4 key购买 nike

我正在使用tokio 0.2.x,但是我需要使用依赖于 super 0.12.35的依赖项。

这导致SpawnError { is_shutdown: true } panic 。

我设法以一种孤立的方式重现了这一点:

cargo.toml

[dependencies]
tokio = { version = "0.2.11", features = ["full"] }
hyper = "0.12.35"
futures = "0.1.29"

这是代码:
use hyper::rt;
use futures::future as future01;

fn future_01() -> impl future01::Future<Item = (), Error = ()> {
future01::ok(())
}

#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
rt::spawn(future_01());
Ok(())
}

我的依赖项将此 rt::spawn深入实现,因此我无法对其进行修改。

理想情况下,我想将 rt::spawn使用的默认执行程序设置为与 tokio::main提供的默认执行程序相同。那可能吗?

最佳答案

Ideally, I would like to set the default executor used by rt::spawn to be the same as the one that tokio::main provides. Is that possible?



不可能, tokio = "0.2.11"仅在执行 std::future::Future时才能生成任务,您无法使用 futures = "0.1.29"创建这些任务,是否需要使用 0.3.x版本,或者您需要使用 compat功能将旧 future 转换为新的 ( see OP's Q&A for details)。

This result in SpawnError { is_shutdown: true } panics.



您正在使用的Hyper在内部使用tokio运行时,它是Tokio的较旧版本(它也位于 Cargo.lock中,具有较新的版本)。在Tokio中,如果没有启动的运行时就无法生成任务,因此您需要像这样生成任务:

fn main() -> Result<(), std::io::Error> {
rt::run(future_01());
Ok(())
}

警告:

如果您仍然想使用2种不同的运行时,一种来自新版本,另一种来自旧版本,请不要像下面那样使用它!您需要在单独的线程中运行它们。

//don't use this code!
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
rt::run(future_01());
Ok(())
}

由于 main是异步的,而 rt::run是阻止功能的( why you shouldn't call long running code inside async fn)

关于rust - 新的Tokio +对旧版Hyper的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59984624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com