这篇博文的灵感来自于juliex,一个最小的执行器,作者也是Rust中的async/await功能的开拓者之一。今天我们要从头开始写一个更现代、更清晰的juliex版本。我们的执行器的目标是只使用简单和完全安全的代码,但是性能可以与现有的最佳执行器匹敌。我们将用作依赖的crate包括crossbeam、async-task、once_cell、futures和num_...
cell_ref 跨越了 await,生成的 future 结构体成员将包含cell_ref,而&Cell<T> 不是Send或Sync的(因为Cell<T>不是Sync),所以生成的 future 既不是 Send 也不是 Sync 如下面代码将报错:future 既不是 Send 也不是 Sync #[tokio::main] async fn main() { #![feature(exclusive_wrapper)] use core::...
once_cell提供了unsync::OnceCell和sync::OnceCell这两种Cell(字面意思,前者用于单线程,后者用于多线程),用来存储堆上的信息,并且具有最多只能赋值一次的特性。API大概是: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 impl<T>OnceCell<T>{fnnew()->OnceCell<T>{...}fnset(&self,value:T)->Result...
once_cell: 提供了全局和本地懒加载变量的支持,允许单次初始化后的不可变访问。 eyre: 提供了一种高度灵活的错误处理和报告方式,允许开发者定义错误报告的样式和上下文。 ordered-float: 提供了浮点数封装器,使得不稳定的浮点数可以被完全排序,从而在集合类型等场合中使用。 bytes: 专注于字节序列操作的库,用于简化...
这篇博文的灵感来自于 juliex,一个最小的执行器,作者也是Rust中的async/await功能的开拓者之一。今天我们要从头开始写一个更现代、更清晰的juliex版本。 我们的执行器的目标是只使用简单和完全安全的代码,但是性能可以与现有的最佳执行器匹敌。 我们将用作依赖的crate包括 crossbeam、 async-task、 once_cell、 fut...
once_cell[docs]具有更符合人体工程学的 API 的更新。有望纳入标准库。应该是所有新项目的首选。 lazy_static[docs]较旧。API 不太方便,但 crate 是稳定和维护的。 迭代器助手: itertools[docs]一堆不在标准库中的迭代器上的有用方法 宏助手: syn[docs]解析 rust 源代码 ...
use once_cell::sync::Lazy; static QUEUE: Lazy<Sender<async_task::Task<()>>> = Lazy::new(|| { let (sender, receiver) = unbounded::<async_task::Task<()>>(); for _ in 0..4 { let recv = receiver.clone(); thread::spawn(|| { ...
借助于async_task的抽象,下面的几十行代码就实现了一个共享全局任务队列的多线程Executor: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 use std::future::Future;use std::thread;use crossbeam::channel::{unbounded,Sender};use futures::executor;use once_cell::sync::Lazy;staticQUEUE:Lazy<Sender<...
Compiling proc-macro2 v1.0.24Compiling unicode-xid v0.2.1Compiling syn v1.0.55Compiling proc-macro-hack v0.5.19Compiling memchr v2.3.4Compiling proc-macro-nested v0.1.6Compiling futures-sink v0.3.8Compiling futures-core v0.3.8Compiling once_cell v1.5.2Compiling futures-io v0.3.8Compiling pin...
once_cellalso has aLazy<T>type, build on top ofOnceCellwhich provides the same API as thelazy_static!macro, but without using any macros: usestd::{sync::Mutex,collections::HashMap};useonce_cell::sync::Lazy;staticGLOBAL_DATA:Lazy<Mutex<HashMap<i32,String>>>=Lazy::new(||{letmutm =...