在tokio 0.2中,有没有一种方法可以在单线程运行时使用tokio::main?

6
< p > 在tokio 0.2中,是否有一种方法可以使用属性#[tokio::main]指定单线程运行时?文档中似乎没有这方面的示例。

编辑:我想找到一种设置tokio运行时的方法,使得rustc知道tokio:spawn()不会启动新线程。

1个回答

9

新的答案,适用于Tokio 0.3.0及以上版本

tokio::main的文档显示了它的选项。 通常情况下,我们希望启动当前线程的运行时,所以有一个特殊的选项来实现这个目的:

#[tokio::main(flavor = "current_thread")]

旧答案,适用于Tokio < 0.3.0

tokio::main的文档显示了它的选项:

core_threads=n - 将核心线程设置为n(需要rt-threaded功能)。 max_threads=n - 将最大线程数设置为n(需要rt-core或rt-threaded功能)。

因此:

#[tokio::main(core_threads = 1, max_threads = 1)]
async fn main() {
    println!("Hello world");
}

如果这种方法对您的情况不起作用,您将不得不如 如何同步返回异步 Future 中计算的值 所示,直接创建一个运行时。

谢谢你的回答。我应该澄清一下,我想找到一种方法让tokio执行器在单个(当前)线程上运行,而不是大小为1的线程池。原因是我希望rustc知道所有任务都在一个线程中,因此无需检查线程安全问题。后来我尝试使用basic_scheduler的方法,但似乎当我调用tokio::spawn()时,rustc仍然认为它是一个新线程。 - user1783732
1
@user1783732,为什么不直接问你想解决的问题呢?你正在展示X-Y问题。你的问题并不是Tokio或异步所特有的,而且显示出你对Rust编译器能力的基本误解。 - Shepmaster
1
@user1783732 您可以使用LocalSetspawn_local将执行限制在单个线程上。它允许在.await边界上传递!Send变量,听起来就像您正在寻找的东西。 - quartzsaber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接