91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

高并發中Poll和Epoll以及Future的概念是什么

發布時間:2021-10-11 09:30:07 來源:億速云 閱讀:177 作者:柒染 欄目:編程語言

高并發中Poll和Epoll以及Future的概念是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

高并發中有幾個重要概念:Poll、Epoll、Future。

Future并不是一個主流的實現,但是Future與Poll的概念又是如此重要,我們必須放在開頭來講,因此這里先將重心放在Rust身上,由于Rust與Go、Java相比對于Future實現比較完整,特性支持也徹底。因此下面的代碼均以Rust為例。

簡單來講Future不是一個值,而是一種值類型,一種在未來才能得到的值類型。Future對象必須實現Rust標準庫中的std::future:: future接口。Future的輸出Output是Future完成后才能生成的值。在Rust中Future通過管理器調用Future::poll來推動Future的運算。Future本質上是一個狀態機,而且可以嵌套使用,我們來看一下面這個例子,在main函數中,我們實例化MainFuture并調用.await,而MainFuture除了在幾個狀態之間遷移以外,還會調用一個Delay的Future,從而實現Future的嵌套。

MainFuture以State0狀態做為初始狀態。當調度器調用poll方法時,MainFuture會嘗試盡可能地提升其狀態。如果future完成,則返回Poll::Ready,如果MainFuture沒有完成,則是由于它等待的DelayFuture沒有達到Ready狀態,那么此時返回Pending。調度器收到Pending結果,會將這個MainFuture重新放回待調度的隊列當中,稍后會再度調用Poll方法來推進Future的執行。具體如下:

use std::future::Future;
use std::pin::Pin;
usestd::task::{Context, Poll};
usestd::time::{Duration, Instant};
 
struct Delay {
    when: Instant,
}
impl Future forDelay {
    type Output = &'static str;
 
    fn poll(self: Pin<&mut Self>, cx:&mut Context<'_>)
        -> Poll<&'static str>
    {
        if Instant::now() >= self.when {
            println!("Hello world");
            Poll::Ready("done")
        } else {
          
            cx.waker().wake_by_ref();
            Poll::Pending
        }
    }
}
enum MainFuture {
   
    State0,
    State1(Delay),
    Terminated,
}
impl Future forMainFuture {
    type Output = ();
 
    fn poll(mut self: Pin<&mut Self>,cx: &mut Context<'_>)
        -> Poll<()>
    {
        use MainFuture::*;
     
        loop {
            match *self {
                State0 => {
                    let when = Instant::now() +
                        Duration::from_millis(1);
                    let future = Delay { when};
                    println!("initstatus");
                    *self = State1(future);
                }
                State1(ref mut my_future) =>{
                    matchPin::new(my_future).poll(cx) {
                        Poll::Ready(out) =>{
                            assert_eq!(out,"done");
                           println!("delay finished this future is ready");
                            *self = Terminated;
                            returnPoll::Ready(());
                        }
                        Poll::Pending => {
                            println!("notready");
                            returnPoll::Pending;
                        }
                    }
                }
                Terminated => {
                    panic!("future polledafter completion")
                }
            }
        }
    }
}
#[tokio::main]
async fn main() {
    let when = Instant::now() +Duration::from_millis(10);
  
    let mainFuture=MainFuture::State0;
    mainFuture.await;
  
}

關于高并發中Poll和Epoll以及Future的概念是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永仁县| 石楼县| 福安市| 措美县| 九台市| 凤台县| 郓城县| 金坛市| 吴忠市| 灵武市| 宿松县| 剑川县| 呼伦贝尔市| 湘阴县| 汤原县| 井研县| 山西省| 莱芜市| 姚安县| 会宁县| 钦州市| 望谟县| 南投市| 翁牛特旗| 浦江县| 蓬溪县| 泾源县| 红桥区| 衡水市| 民丰县| 加查县| 泽库县| 钟祥市| 苏尼特右旗| 达拉特旗| 万安县| 河北省| 琼结县| 铁力市| 类乌齐县| 崇义县|