rust-coroutine
3
总安装量
2
周安装量
#55672
全站排名
安装命令
npx skills add https://github.com/huiali/rust-skills --skill rust-coroutine
Agent 安装分布
claude-code
2
trae
1
qoder
1
trae-cn
1
antigravity
1
Skill 文档
åç¨ä¸ç»¿è²çº¿ç¨
æ ¸å¿é®é¢
å¦ä½å®ç°é«æçè½»é级并åï¼
åç¨æä¾ç¨æ·æçä¸ä¸æåæ¢ï¼é¿å å æ ¸çº¿ç¨çå¼éã
åç¨ vs 线ç¨
| ç¹æ§ | OS çº¿ç¨ | åç¨ |
|---|---|---|
| è°åº¦ | å æ ¸ | ç¨æ·æ |
| 忢å¼é | ~1μs | ~100ns |
| æ°ééå¶ | æ°å | æ°åä¸ |
| æ å¤§å° | 1-8MB | å KB |
| æ¢å | æ¢å å¼ | åä½å¼ |
Rust åç Generator
// Rust Nightly ç generator
#![feature(generators)]
#![feature(generator_trait)]
use std::ops::Generator;
fn simple_generator() -> impl Generator<Yield = i32, Return = ()> {
|| {
yield 1;
yield 2;
yield 3;
// Generator 宿
}
}
fn main() {
let mut gen = simple_generator();
loop {
match unsafe { Pin::new_unchecked(&mut gen).resume() } {
GeneratorState::Yielded(v) => println!("Yielded: {}", v),
GeneratorState::Complete(()) => {
println!("Done!");
break;
}
}
}
}
æ å¼åç¨ (Stackful Coroutine)
// ä½¿ç¨ stackful åç¨åº
use corosensei::{Coroutine, Pin, Unpin};
fn runner<'a>(start: bool, coroutine: &'a Coroutine<'_, ()>) {
if start {
println!("Starting coroutine");
coroutine.run();
}
}
fn main() {
let coroutine = Coroutine::new(|_| {
println!(" In coroutine - 1");
corosensei::yield!();
println!(" In coroutine - 2");
corosensei::yield!();
println!(" In coroutine - 3");
});
let mut pin = Pin::new(&coroutine);
unsafe { pin.as_mut().set_running(true) };
println!("Main: first resume");
unsafe { pin.resume(false) }; // false = 䏿¯ç¬¬ä¸æ¬¡
println!("Main: second resume");
unsafe { pin.resume(false) };
println!("Main: third resume");
unsafe { pin.resume(false) };
println!("Main: done");
}
æ å¼åç¨è®¾è®¡æ¨¡å¼
1. åç¨ç¶ææº
enum CoroutineState {
Init,
Processing,
Waiting,
Done,
}
struct StatefulCoroutine {
state: CoroutineState,
data: Vec<u8>,
}
impl StatefulCoroutine {
fn new() -> Self {
Self {
state: CoroutineState::Init,
data: Vec::new(),
}
}
fn step(&mut self) {
match self.state {
CoroutineState::Init => {
println!("Initialize");
self.state = CoroutineState::Processing;
}
CoroutineState::Processing => {
println!("Processing data");
self.state = CoroutineState::Waiting;
}
CoroutineState::Waiting => {
println!("Waiting for I/O");
self.state = CoroutineState::Done;
}
CoroutineState::Done => {
println!("Already done");
}
}
}
}
2. åç¨æ±
use std::sync::Arc;
use std::thread;
use std::sync::mpsc;
struct CoroutinePool {
workers: Vec<thread::JoinHandle<()>>,
sender: mpsc::Sender<Job>,
}
struct Job {
data: Vec<u8>,
result_tx: mpsc::Sender<Result<Vec<u8>, ()>>,
}
impl CoroutinePool {
pub fn new(size: usize) -> Self {
let (sender, receiver) = mpsc::channel();
let receiver = Arc::new(receiver);
let workers = (0..size)
.map(|_| {
let receiver = Arc::clone(&receiver);
thread::spawn(move || {
while let Ok(job) = receiver.recv() {
// å¤ç job
let result = process_job(&job);
let _ = job.result_tx.send(result);
}
})
})
.collect();
Self { workers, sender }
}
pub fn submit(&self, data: Vec<u8>) -> mpsc::Receiver<Result<Vec<u8>, ()>> {
let (result_tx, result_rx) = mpsc::channel();
let job = Job { data, result_tx };
self.sender.send(job).unwrap();
result_rx
}
}
fn process_job(job: &Job) -> Result<Vec<u8>, ()> {
Ok(job.data.clone())
}
æ æ å ³åç¨ (Stackless Coroutine)
// ä½¿ç¨ async/await å®ç°æ æ å
³åç¨
async fn async_task(id: u32) -> u32 {
println!("Task {} started", id);
// 模æ I/O æä½
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
println!("Task {} resumed", id);
id * 2
}
async fn main() {
// å¹¶åæ§è¡å¤ä¸ªåç¨
let results = futures::future::join_all(
(0..10).map(|i| async_task(i))
).await;
println!("Results: {:?}", results);
}
ä¸ä¸æåæ¢æºå¶
// æå¨ä¸ä¸æåæ¢
use std::arch::asm;
struct Context {
rsp: u64,
r15: u64,
r14: u64,
r13: u64,
r12: u64,
rbp: u64,
rbx: u64,
}
impl Context {
unsafe fn new(stack: &mut [u8]) -> Self {
let stack_top = stack.as_mut_ptr().add(stack.len());
let rsp = (stack_top as *mut u64).wrapping_sub(1) as u64;
Self {
rsp,
r15: 0,
r14: 0,
r13: 0,
r12: 0,
rbp: 0,
rbx: 0,
}
}
unsafe fn switch(&mut self, next: &mut Context) {
asm!(
"push rbx",
"push rbp",
"push r12",
"push r13",
"push r14",
"push r15",
"mov [rdi], rsp", // ä¿åå½åæ æé
"mov rsp, [rsi]", // 忢尿°æ
"pop r15",
"pop r14",
"pop r13",
"pop r12",
"pop rbp",
"pop rbx",
in("rdi") self as *mut Context,
in("rsi") next as *mut Context,
);
}
}
åç¨è°åº¦å¨
// ç®ååç¨è°åº¦å¨
enum Task {
Coroutine(fn(&mut Scheduler)),
Finished,
}
struct Scheduler {
ready: Vec<Task>,
current: Option<Task>,
}
impl Scheduler {
pub fn new() -> Self {
Self {
ready: Vec::new(),
current: None,
}
}
pub fn spawn(&mut self, task: Task) {
self.ready.push(task);
}
pub fn run(&mut self) {
while let Some(task) = self.ready.pop() {
self.current = Some(task);
match std::mem::replace(&mut self.ready, vec![]) {
Task::Coroutine(f) => f(self),
Task::Finished => continue,
}
}
}
}
常è§é®é¢
| é®é¢ | åå | è§£å³ |
|---|---|---|
| åç¨ä¸æ§è¡ | 缺å°è°åº¦å¨ | å®ç°æä½¿ç¨è°åº¦å¨ |
| æ æº¢åº | éå½å¤ªæ·± | 使ç¨å åé æ |
| å åæ³æ¼ | 任塿ªå®æ | æ£ç¡®æ¸ çåç¨ |
| æ»é | 循ç¯çå¾ | é¿å 循ç¯ä¾èµ |
ä¸å ¶ä»æè½å ³è
rust-coroutine
â
ââ⺠rust-async â async/await å®ç°
ââ⺠rust-concurrency â 并忍¡å
ââ⺠rust-performance â æ§è½ä¼å