rust 多线程时雄是否在单个操作系统线程上运行任务?

sczxawaw  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(110)

当我在时雄多线程运行时中生成一个任务时,它是否保证它将选择一个运行时操作系统线程并仅在其上运行?或者当轮询期货时,它可能会在不同的操作系统线程之间跳转?

  • UPDATE*:如果任务可以在OS线程之间切换,是否可以配置为只使用一个线程?
vmpqdwk3

vmpqdwk31#

在时雄中有多种工具可以处理任务到线程的Map:
1.运行时可以使用多个线程(默认)或单个线程。
1.可以产生任务,这些任务可以在任何运行时线程上执行,或者可以固定到当前运行时线程。
1.任务可以在正常运行时池之外的专用线程上产生。
更多详情,敬请关注!

运行时

时雄有两个运行时:一个是多线程的,它使用工作窃取来获得最佳效率,另一个是单线程的。
您可以使用runtime::Builder手动选择运行时:

let runtime = runtime::Builder::{new_multi_thread, new_current_thread}().build()?;

字符串
也可以使用属性宏main

//  Default, ie multi-threaded.
#[tokio::main]
async fn main() -> ... { ... }

//  Explicit multi-threaded, you can also configure the number of worker-threads.
#[tokio::main(flavor = "multi_thread", worker_threads = N)]
async fn main() -> ... { ... }

//  Single-threaded.
#[tokio::main(flavor = "current_thread")]
async fn main() -> ... { ... }

任务生成

您可以根据单个任务决定在何处运行它:

  • spawn将使用当前运行时工作线程池。
  • spawn_local将使用当前线程。
  • spawn_blocking将使用一个新创建的线程,专门为这个任务保留。

spawnspawn_blocking都要求任务及其结果为Send,因为它们涉及(潜在的)线程迁移,而spawn_local没有这样的要求。

任务迁移

那么,任务何时从一个线程迁移到另一个线程?这主要取决于你如何生成它:

  • spawn_local从不涉及移动任务或其结果。
  • spawn_blocking总是涉及最初将任务移动到另一个线程,并返回其结果,但任务在执行期间不会移动。
  • spawn * 可能 * 涉及在任务生命周期内的任何时间点移动任务,并将其结果移回,* 如果 * 使用具有多个工作线程的多线程运行时。

就是这样

g9icjywg

g9icjywg2#

是的,任务可以在OS线程之间切换,因为时雄正在使用工作窃取调度程序。这就是为什么tasks are required to be Send
如果你想留在同一个线程上,除了按照@isaactfa的建议改变整个运行时(这有不使用所有内核的缺点),你可以使用LocalSetspawn_local()

4bbkushb

4bbkushb3#

当前线程调度器

当前线程调度程序提供了一个单线程的未来执行器。所有任务都将在当前线程上创建和执行。这需要rt功能标志。

use tokio::runtime;

let rt = runtime::Builder::new_current_thread()
    .build()?;

字符串
若要使用称为current_thread运行时的单线程运行时,可以使用

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

相关问题