当我在时雄多线程运行时中生成一个任务时,它是否保证它将选择一个运行时操作系统线程并仅在其上运行?或者当轮询期货时,它可能会在不同的操作系统线程之间跳转?
vmpqdwk31#
在时雄中有多种工具可以处理任务到线程的Map:1.运行时可以使用多个线程(默认)或单个线程。1.可以产生任务,这些任务可以在任何运行时线程上执行,或者可以固定到当前运行时线程。1.任务可以在正常运行时池之外的专用线程上产生。更多详情,敬请关注!
时雄有两个运行时:一个是多线程的,它使用工作窃取来获得最佳效率,另一个是单线程的。您可以使用runtime::Builder手动选择运行时:
runtime::Builder
let runtime = runtime::Builder::{new_multi_thread, new_current_thread}().build()?;
字符串也可以使用属性宏main:
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
spawn和spawn_blocking都要求任务及其结果为Send,因为它们涉及(潜在的)线程迁移,而spawn_local没有这样的要求。
Send
那么,任务何时从一个线程迁移到另一个线程?这主要取决于你如何生成它:
就是这样
g9icjywg2#
是的,任务可以在OS线程之间切换,因为时雄正在使用工作窃取调度程序。这就是为什么tasks are required to be Send。如果你想留在同一个线程上,除了按照@isaactfa的建议改变整个运行时(这有不使用所有内核的缺点),你可以使用LocalSet和spawn_local()。
LocalSet
spawn_local()
4bbkushb3#
当前线程调度程序提供了一个单线程的未来执行器。所有任务都将在当前线程上创建和执行。这需要rt功能标志。
rt
use tokio::runtime; let rt = runtime::Builder::new_current_thread() .build()?;
字符串若要使用称为current_thread运行时的单线程运行时,可以使用
#[tokio::main(flavor = "current_thread")]
3条答案
按热度按时间vmpqdwk31#
在时雄中有多种工具可以处理任务到线程的Map:
1.运行时可以使用多个线程(默认)或单个线程。
1.可以产生任务,这些任务可以在任何运行时线程上执行,或者可以固定到当前运行时线程。
1.任务可以在正常运行时池之外的专用线程上产生。
更多详情,敬请关注!
运行时
时雄有两个运行时:一个是多线程的,它使用工作窃取来获得最佳效率,另一个是单线程的。
您可以使用
runtime::Builder
手动选择运行时:字符串
也可以使用属性宏
main
:型
任务生成
您可以根据单个任务决定在何处运行它:
spawn
将使用当前运行时工作线程池。spawn_local
将使用当前线程。spawn_blocking
将使用一个新创建的线程,专门为这个任务保留。spawn
和spawn_blocking
都要求任务及其结果为Send
,因为它们涉及(潜在的)线程迁移,而spawn_local
没有这样的要求。任务迁移
那么,任务何时从一个线程迁移到另一个线程?这主要取决于你如何生成它:
spawn_local
从不涉及移动任务或其结果。spawn_blocking
总是涉及最初将任务移动到另一个线程,并返回其结果,但任务在执行期间不会移动。spawn
* 可能 * 涉及在任务生命周期内的任何时间点移动任务,并将其结果移回,* 如果 * 使用具有多个工作线程的多线程运行时。就是这样
g9icjywg2#
是的,任务可以在OS线程之间切换,因为时雄正在使用工作窃取调度程序。这就是为什么tasks are required to be
Send
。如果你想留在同一个线程上,除了按照@isaactfa的建议改变整个运行时(这有不使用所有内核的缺点),你可以使用
LocalSet
和spawn_local()
。4bbkushb3#
当前线程调度器
当前线程调度程序提供了一个单线程的未来执行器。所有任务都将在当前线程上创建和执行。这需要
rt
功能标志。字符串
若要使用称为current_thread运行时的单线程运行时,可以使用
型