我正在尝试创建最简单的示例,以便能够使
显然这不是我应该做的事情。即便如此,假设我已经得到了“Pin”和“Future”,现在我需要以某种方式进行“poll()”。为此,我需要一个“Waker”。
因此,我试图找到如何获取“Waker”的方法。在doc上看起来似乎唯一的方法是使用另一个接受“RawWaker”的“new_unchecked”。从那里我到达了here,然后到达了here,在那里我只能蜷缩在地板上哭泣。
async fn hello()
最终打印出Hello World!
。这应该在没有任何外部依赖项(如tokio
)的情况下发生,只使用纯Rust和std
。如果我们能够做到不使用unsafe
就完成它,那么就额外加分。#![feature(async_await)]
async fn hello() {
println!("Hello, World!");
}
fn main() {
let task = hello();
// Something beautiful happens here, and `Hello, World!` is printed on screen.
}
- 我知道
async/await
仍然是一项夜间功能,并且在可预见的未来可能会发生变化。 - 我知道有很多
Future
实现,我知道tokio
的存在。 - 我只是尝试了解标准库futures的内部工作原理。
我的无助、笨拙的努力
我模糊地理解,首先需要钉住Pin
任务。所以我继续前进并进行了
let pinned_task = Pin::new(&mut task);
但是
the trait `std::marker::Unpin` is not implemented for `std::future::GenFuture<[static generator@src/main.rs:7:18: 9:2 {}]>`
因此我想,当然,我可能需要将其包装为Box
,以确保它不会在内存中移动。 令人惊讶的是,我收到了相同的错误。
到目前为止,我能够得到的是:
let pinned_task = unsafe {
Pin::new_unchecked(&mut task)
};
显然这不是我应该做的事情。即便如此,假设我已经得到了“Pin”和“Future”,现在我需要以某种方式进行“poll()”。为此,我需要一个“Waker”。
因此,我试图找到如何获取“Waker”的方法。在doc上看起来似乎唯一的方法是使用另一个接受“RawWaker”的“new_unchecked”。从那里我到达了here,然后到达了here,在那里我只能蜷缩在地板上哭泣。
async/await
特性仍然在夜间版中吗(因此会出现#![feature(async_await)]
),但std::Future
接口现在稳定了,对吗? - Matteo MontiFuture
已在夜间编译器中稳定下来,但该稳定尚未传播到beta通道。它肯定还没有传播到任何发布的Rust版本。 - ShepmasterFuture
将在 1.36.0 版本中稳定,但不会在当前稳定版本(1.34.0)中出现。您需要使用async fn hellow
功能。 - hellow