在v0.2我们实现了所有运算符和可视线程的安全性之后,RxRust现在可以通过调度程序跨线程传递任务。这样,所有用户提供的闭包都必须满足Send + Sync + 'static
,甚至永远不需要使用调度程序和多线程。
现在,我们移除了bounds的Sync
,Send
和'static
,并添加了新的特性IntoShared
。这样可以为本地线程实现运算符,并实现IntoShared
将其转换为线程安全的运算符。默认情况下,RxRust始终使用单线程版本以获得最佳性能,如果需要在线程中传递IntoShared
对象,则使用RxRust 将本地对象转换为线程安全的对象。
let res = Arc::new(Mutex(0));
let c_res = res.clone();
observable::of(100).subscribe(|v| { *res.lock().unwrap() = *v });
assert_eq!(*res.lock().unwrap(), 100);
let mut res = 0;
observable::of!(100).subscribe(|v| { res = *v });
assert_eq!(res, 100);
重要变化 移除 RxFn
和 RxValue
Multicast
ObservableOnce
observable::from_vec
和 observable::from_range
函数整合到 宏observable::from_iter!
.observable::empty
函数变为宏observable::empty!
.observable::of
函数变为宏 observable::of!
.observable::from_future
函数变为宏 observable::from_future!
observable::from_future_with_err
函数变为宏observable::from_future_with_err!
observable::interval
函数变为宏observable::interval!
详细信息前往GitHub查看
详细信息前往GitHub查看
调度程序的作用是调度工作。一个应用程序被分解为多个工作单元,我们将它们称为任务。当任务可以进展时,它是可运行的;而在外部资源上被阻塞时,该任务将不可可运行(或空闲)。任务是独立的,因为任何数量的可运行任务都可以同时执行。调度程序负责在运行状态下执行任务,直到它们过渡回空闲状态为止。执行任务意味着需要为任务分配CPU时间(一种全局资源)。
有许多不同的建模调度程序的方法,每种方法各有利弊。
Tokio的第一个工作窃取调度程序于2018年三月问世,这是基于许多前者不正确的假设的首次尝试。
有关Tokio的更多信息前往官方博客查看