hiasync 0.1.0

Supports only single-threaded asynchronous runtime
Documentation

hiasync

一个单线程下调度异步任务的运行时, 不依赖任何底层系统接口,仅提供在同步环境下调用异步函数的能力.

主要应用于将非阻塞接口实现的同步函数改造为异步函数的场景.

如下是一个例子:

fn process_msg1(msg: Msg) {
    // ...
    nonblock_send_msg(new_request);
}

fn process_msg2(msg: Msg) {
    // ...
    nonblock_send_msg(new_request);
}

fn main() {
    while let Ok(msg) = recv_msg() {
        match msg.id {
            MSG_ID_1 => process_msg1(msg),
            MSG_ID_2 => process_msg2(msg),
            _ => //...
        }
    }
}

我们希望将process_msg改造为异步函数,可以如下实现:

use hiasync::{wait_event, Event, Runtime};

async fn process_msg1() {
    let msg = wait_event::<Msg>(MSG_ID_1).await.unwrap();
    //...
    nonblock_send_msg(new_request);
}

async fn process_msg2() {
    let msg = wait_event::<Msg>(MSG_ID_2).await.unwrap();
    //...
    nonblock_send_msg(new_request);
}

fn main() {
    let mut rt = Runtime::new();
    let _ = rt.spawn(process_msg1());
    let _ = rt.spawn(process_msg2());
    while let Ok(msg) = recv_msg() {
        rt.sched_events(&[Event::new(msg.id, &msg)]);
    }
}