- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码
extern crate futures; // v0.1 (old)
use std::sync::{atomic, Arc};
use futures::*;
struct F(Arc<atomic::AtomicBool>);
impl Future for F {
type Item = ();
type Error = ();
fn poll(&mut self) -> Result<Async<Self::Item>, Self::Error> {
println!("Check if flag is set");
if self.0.load(atomic::Ordering::Relaxed) {
Ok(Async::Ready(()))
} else {
Ok(Async::NotReady)
}
}
}
fn main() {
let flag = Arc::new(atomic::AtomicBool::new(false));
let future = F(flag.clone());
::std::thread::spawn(move || {
::std::thread::sleep_ms(10);
println!("set flag");
flag.store(true, atomic::Ordering::Relaxed);
});
// ::std::thread::sleep_ms(20);
let result = future.wait();
println!("result: {:?}", result);
}
生成的线程设置一个标志, future 等待。我们还休眠生成的线程,因此来自 .wait()
的初始 .poll()
调用是在设置标志之前。这会导致 .wait()
无限期地(看似)阻塞。如果我们取消注释另一个 thread::sleep_ms
,.wait()
返回,并打印出结果 (()
)。
我希望当前线程尝试通过多次调用 poll
来解决 future 问题,因为我们正在阻塞当前线程。然而,这并没有发生。
我试过阅读 some docs ,似乎问题在于线程在第一次从 poll
获得 NotReady
后被 park
ed。但是,我不清楚为什么会这样,或者如何解决这个问题。
我错过了什么?
最佳答案
为什么您需要停放等待的 future 而不是反复轮询?答案很明显,恕我直言。因为归根结底,它会更快、更高效!
要反复轮询 future (可能被称为“忙等待”),图书馆必须决定是经常还是很少这样做,而且两个答案都不令人满意。经常这样做,你会浪费 CPU 周期,很少这样做,代码 react 很慢。
是的,您需要在等待某事时停放任务,然后在等待完成后将其取消停放。像这样:
#![allow(deprecated)]
extern crate futures;
use std::sync::{Arc, Mutex};
use futures::*;
use futures::task::{park, Task};
struct Status {
ready: bool,
task: Option<Task>,
}
#[allow(dead_code)]
struct F(Arc<Mutex<Status>>);
impl Future for F {
type Item = ();
type Error = ();
fn poll(&mut self) -> Result<Async<Self::Item>, Self::Error> {
println!("Check if flag is set");
let mut status = self.0.lock().expect("!lock");
if status.ready {
Ok(Async::Ready(()))
} else {
status.task = Some(park());
Ok(Async::NotReady)
}
}
}
#[test]
fn test() {
let flag = Arc::new(Mutex::new(Status {
ready: false,
task: None,
}));
let future = F(flag.clone());
::std::thread::spawn(move || {
::std::thread::sleep_ms(10);
println!("set flag");
let mut status = flag.lock().expect("!lock");
status.ready = true;
if let Some(ref task) = status.task {
task.unpark()
}
});
let result = future.wait();
println!("result: {:?}", result);
}
请注意 Future::poll
在这里做了几件事:它正在检查外部条件并停止任务,因此可以进行比赛,例如时间:
poll
检查变量并发现它是false
; true
; poll
停放了任务,但是砰!为时已晚,没有人会再将其打开。 为了避免任何竞争,我使用了 Mutex
来同步这些交互。
附言如果您只需要将线程结果包装到 Future
中,那么请考虑使用 oneshot
channel :它有Receiver
已经实现了 Future
接口(interface)。
关于multithreading - 为什么在返回 `Future::poll` 后没有重复调用 `NotReady` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503953/
如果集群中的某些节点处于关闭状态,并且状态变为NotReady,我可以使其触发某些操作吗? 我尝试使用client-go和curl观看/api/v1/watch/nodes并在节点状态更改any时得到
我在 CentOS7 上的 VM cloude 中有一个由 3 个主节点和 2 个节点组成的 Kubernetes 集群: [root@kbn-mst-02 ~]# kubectl get nodes
我一直在尝试在一组 Raspberry Pi 上设置 K8s 集群。这是我的 GitHub 页面的链接,描述了整个设置: https://github.com/joesan/plant-infra/b
我的 K8S 集群版本为 1.13.2,我想升级到版本 1.17.x(最新的 1.17)。 我看了官方说明:https://kubernetes.io/docs/tasks/administer-cl
我已安装 Kubernetes cluster on CentOS-8但节点状态显示 NotReady , coredns 的命名空间状态显示 pending和织网状态显示CrashLoopBackO
我已经安装了两个节点 kubernetes 1.12.1在云虚拟机中,都在互联网代理之后。每个 VM 都有关联的 float IP 以通过 SSH 连接,kube-01是大师和kube-02是一个节点
我实现了 future 并向它发出请求,但它阻止了我的 curl 并且日志显示 poll 只被调用了一次。 我有没有做错什么? use failure::{format_err, Error}; us
我正在尝试运行一个 super 服务器,它使用 future 对请求进行异步响应。当 future 的 poll 方法被调用并返回 Async::NotReady 时,连接就被丢弃了(“droppin
考虑以下代码 extern crate futures; // v0.1 (old) use std::sync::{atomic, Arc}; use futures::*; struct F(Ar
我在生产环境中遇到了一个非常复杂的 Kubernetes 问题,丢失了所有代理节点,它们从 Ready 变为 NotReady,所有 pod 从 Running 变为 NodeLost 状态。我发现
我正在尝试制作一个 Stream ,它会等到特定字符进入缓冲区。我知道 BufRead 上有 read_until() 但我实际上需要一个自定义解决方案,因为这是实现等待缓冲区中的特定字符串(或者,对
我的实验性双节点 Kubernetes 1.13.2 不幸进入了第二个节点为 NotReady 的模式。 .我试过systemctl restart kubelet在两个节点上,但到目前为止这没有帮助
我正在尝试将 Kinect SDK v1 与 Xbox Kinect 传感器结合使用。我在我的开发机器上安装了 SDK,并启动了示例。 C# 示例不起作用,我得到“糟糕,出现错误”或“未就绪”状态,并
我是一名优秀的程序员,十分优秀!