gpt4 book ai didi

rust - 有没有办法在 Rust 的异步函数中获取对当前任务上下文的引用?

转载 作者:行者123 更新时间:2023-11-29 08:30:49 28 4
gpt4 key购买 nike

在 rust 异步函数中有什么方法可以访问当前的 Context没有写一个Future的显式实现?

最佳答案

在真正回答这个问题之前,记住什么是Context是很有用的;每当您编写依赖于外部资源(例如 I/O)的 Future 的实现时,您都不想忙等待任何事情。因此,您很可能会实现 Future,您将在其中返回 Pending 然后唤醒它。 Context(和 Waker)就是为此目的而存在的。

然而,这就是它们的本质:低级的实现细节。如果您已经在使用 Future 而不是编写一个低级实现,则 Waker 很可能包含在某处,但是您无法直接访问。

因此,Waker 直接泄漏在 99.9% 的情况下是实现细节泄漏,实际上并不推荐。 Waker 用作更大 struct 的一部分非常好,但是,这是您需要实现自己的 Future 从零开始。 对此没有其他有效的用例,并且在正常情况下,您永远不需要直接访问 Waker

由于 playground 的限制,遗憾的是我无法向您展示何时获取此 Waker 有用的实例;然而,这样的 future 设置可能会用在这样的情况下:假设我们正在 build 房子的前门。我们有一个门铃和一扇门,我们希望在有人按门铃时得到通知。但是,我们不想在门口等待访客。

因此,我们创建了两个对象:FrontDoorDoorbell,我们将选项提供给 wire() Doorbell 连接两者。

pub struct FrontDoor {
doorbell: Arc<RwLock<Doorbell>>
}

impl FrontDoor {
pub fn new() -> FrontDoor {
FrontDoor {
doorbell: Arc::new(RwLock::new(Doorbell {
waker: None,
visitor: false
}))
}
}
pub fn wire(&self) -> Arc<RwLock<Doorbell>> {
self.doorbell.clone() // We retrieve the bell
}
}

impl Future for FrontDoor {

type Output = ();

fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
self.doorbell.read().map(|guard| {
match guard.visitor {
true => Poll::Ready(()),
false => Poll::Pending
}
}).unwrap_or(Poll::Pending)
}
}


pub struct Doorbell {
waker: Option<Waker>,
pub visitor: bool
}

impl Doorbell {
pub fn ring(&mut self) {
self.visitor = true;
self.waker.as_ref().map(|waker| waker.wake_by_ref());
}
}

我们的 FrontDoor 实现了 Future,这意味着我们可以将它交给您选择的执行器; waker 包含在 Doorbell 对象中,它允许我们“响铃”并唤醒我们的 future 。

关于rust - 有没有办法在 Rust 的异步函数中获取对当前任务上下文的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351482/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com