为什么在执行时不执行从 Future::poll() 调用的异步 fn()?
Why is an async fn() called from Future::poll() not executed at the time of execution?
我在 Future::poll()
中调用 async fn()
但是 .await
语句及其背后的代码在执行时并未执行。
use futures::FutureExt;
use std::future::Future;
use std::pin::Pin;
use std::sync::{Arc, Mutex};
use std::task::{Context, Poll};
#[pin_project::pin_project]
struct Person<'a> {
name: &'a str,
age: i32,
}
impl<'a> Future for Person<'a> {
type Output = i32;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut this = self.project();
*this.age += 10;
let mut fut1 = fn1();
let pinfut1 = Pin::new(&mut fut1);
//let pinfut1 = unsafe { Pin::new_unchecked(&mut fut1) };
pinfut1.poll(cx)
}
}
fn fn1() -> impl Future<Output = i32> + Unpin {
async {
dbg!("sleep start!"); // execute here!
async_std::task::sleep(std::time::Duration::from_secs(5)).await; // <--- blocked here ?
dbg!("sleep done!"); // Never execute here!
123
}
.boxed()
}
fn main() {
let p1 = Person {
name: "jack",
age: Default::default(),
};
async_std::task::block_on(async {
let a = p1.await;
dbg!(a); // Never execute here!
});
std::thread::park();
}
Cargo.toml:
[package]
name = "test-poll"
version = "0.1.0"
authors = ["xx <xx@xx.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
async-std="1.8.0"
pin-project="0.4.6"
futures=""
每次你的 Person
未来被投票时,你都会创建一个全新的 fn1
未来:
let mut fut1 = fn1();
那个未来等待 5 秒,然后唤醒执行器,轮询 Person
,然后创建一个全新的 fn1
未来,等待 5 秒...
有关如何正确执行此操作的说明,请参阅 (尽管我同意您可能 不想 首先执行此操作)。
我在 Future::poll()
中调用 async fn()
但是 .await
语句及其背后的代码在执行时并未执行。
use futures::FutureExt;
use std::future::Future;
use std::pin::Pin;
use std::sync::{Arc, Mutex};
use std::task::{Context, Poll};
#[pin_project::pin_project]
struct Person<'a> {
name: &'a str,
age: i32,
}
impl<'a> Future for Person<'a> {
type Output = i32;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut this = self.project();
*this.age += 10;
let mut fut1 = fn1();
let pinfut1 = Pin::new(&mut fut1);
//let pinfut1 = unsafe { Pin::new_unchecked(&mut fut1) };
pinfut1.poll(cx)
}
}
fn fn1() -> impl Future<Output = i32> + Unpin {
async {
dbg!("sleep start!"); // execute here!
async_std::task::sleep(std::time::Duration::from_secs(5)).await; // <--- blocked here ?
dbg!("sleep done!"); // Never execute here!
123
}
.boxed()
}
fn main() {
let p1 = Person {
name: "jack",
age: Default::default(),
};
async_std::task::block_on(async {
let a = p1.await;
dbg!(a); // Never execute here!
});
std::thread::park();
}
Cargo.toml:
[package]
name = "test-poll"
version = "0.1.0"
authors = ["xx <xx@xx.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
async-std="1.8.0"
pin-project="0.4.6"
futures=""
每次你的 Person
未来被投票时,你都会创建一个全新的 fn1
未来:
let mut fut1 = fn1();
那个未来等待 5 秒,然后唤醒执行器,轮询 Person
,然后创建一个全新的 fn1
未来,等待 5 秒...
有关如何正确执行此操作的说明,请参阅