【发布时间】:2022-06-15 23:49:01
【问题描述】:
我愿意impl 一个简单的Future 计数器,但是这绝对是错误的。如果不使用Context,以下程序将永远阻塞;
use std::future::Future;
use std::task::{Poll, Context};
use std::pin::Pin;
use futures::executor::block_on;
struct MyStruct {
counter: u32
}
impl Future for MyStruct {
type Output = String;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if self.counter == 5 {
Poll::Ready(self.counter.to_string())
} else {
unsafe {
Pin::get_unchecked_mut(self).counter += 1;
}
// cx.waker().wake();
Poll::Pending
}
}
}
fn main() {
let ms = MyStruct{counter: 0};
block_on(ms);
}
我想我必须以某种方式推迟Waker 的通话,但这并不是那么简单。所以我想知道,如何以最简单的形式wake呢?
【问题讨论】:
-
不确定我是否理解目标。未来不会产生多个结果,因此即使您的
poll()工作正常,也与立即返回Poll::Ready("5")没有什么不同。 -
@kmdreko,我想让它被轮询几次,直到用
Poll::Ready(...)解决它 -
但是为什么呢?或者这只是一个学习练习?
-
@kmdreko,只是自学经验)在 Future 的普通实现中,有套接字或其他一些 fd,所以整个魔法都在
epoll系统调用中。这么多额外的东西并没有引起太大的兴趣。所以我想构建一个不涉及任何套接字的简洁示例。 -
您的代码(每次都正确调用
.wake())does work,因为它将被轮询完成。在最基本的层面上,调用.wake()将再次告诉处理未来的执行者.poll()。