#task #data #notify #mutable #async-task #lock #wake

task-notify

当有人更改它们感兴趣的数据时,通知异步任务

2 个版本 (1 个稳定版)

1.0.0 2023年2月15日
0.1.0 2021年1月28日

#673并发

每月下载 24 次
4 个 Crates 中使用(通过 netmod-udp

GPL-3.0-or-later

6KB

task-notify

包装器,当对包装值进行可变访问时唤醒任务。

这可以用来透明地通知异步任务,例如,它应该检查队列中的更多工作或再次尝试获取锁。

let c = Arc::new(Mutex::new(Notify::new(VecDeque::new())));
// task 1
async fn task_1() {
  let mut mg = c.lock().await;
  mg.push_back(42); // access via DerefMut
}
// task 2
impl Future for Task2 {
    type Output = u64;
    fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
        let mut lock = Box::pin(t.lock());
        match Pin::new(&mut lock).poll(cx) {
            Poll::Ready(ref mut mg) => match mg.pop_front() {
                Some(v) => Poll::Ready(v),
                None => {
                    // Insert a Waker when we can't make progress for the first time!
                    Notify::add_waker(mg, cx.waker().clone());
                    Poll::Pending
                }
            },
            p => p, // The Mutex will wake us if we can make progress
        }
    }
}

无运行时依赖