您好,登錄后才能下訂單哦!
高并發(fā)中Poll和Epoll以及Future的概念是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
高并發(fā)中有幾個(gè)重要概念:Poll、Epoll、Future。
Future并不是一個(gè)主流的實(shí)現(xiàn),但是Future與Poll的概念又是如此重要,我們必須放在開頭來(lái)講,因此這里先將重心放在Rust身上,由于Rust與Go、Java相比對(duì)于Future實(shí)現(xiàn)比較完整,特性支持也徹底。因此下面的代碼均以Rust為例。
簡(jiǎn)單來(lái)講Future不是一個(gè)值,而是一種值類型,一種在未來(lái)才能得到的值類型。Future對(duì)象必須實(shí)現(xiàn)Rust標(biāo)準(zhǔn)庫(kù)中的std::future:: future接口。Future的輸出Output是Future完成后才能生成的值。在Rust中Future通過管理器調(diào)用Future::poll來(lái)推動(dòng)Future的運(yùn)算。Future本質(zhì)上是一個(gè)狀態(tài)機(jī),而且可以嵌套使用,我們來(lái)看一下面這個(gè)例子,在main函數(shù)中,我們實(shí)例化MainFuture并調(diào)用.await,而MainFuture除了在幾個(gè)狀態(tài)之間遷移以外,還會(huì)調(diào)用一個(gè)Delay的Future,從而實(shí)現(xiàn)Future的嵌套。
MainFuture以State0狀態(tài)做為初始狀態(tài)。當(dāng)調(diào)度器調(diào)用poll方法時(shí),MainFuture會(huì)嘗試盡可能地提升其狀態(tài)。如果future完成,則返回Poll::Ready,如果MainFuture沒有完成,則是由于它等待的DelayFuture沒有達(dá)到Ready狀態(tài),那么此時(shí)返回Pending。調(diào)度器收到Pending結(jié)果,會(huì)將這個(gè)MainFuture重新放回待調(diào)度的隊(duì)列當(dāng)中,稍后會(huì)再度調(diào)用Poll方法來(lái)推進(jìn)Future的執(zhí)行。具體如下:
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; }
關(guān)于高并發(fā)中Poll和Epoll以及Future的概念是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。