小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

事件驅(qū)動(dòng)的詳解

 liang1234_ 2019-02-05

事件驅(qū)動(dòng)和異步IO

通常,我們寫服務(wù)器處理模型的程序時(shí),有以下幾種模型:
(1)每收到一個(gè)請(qǐng)求,創(chuàng)建一個(gè)新的進(jìn)程,來處理該請(qǐng)求;
(2)每收到一個(gè)請(qǐng)求,創(chuàng)建一個(gè)新的線程,來處理該請(qǐng)求;
(3)每收到一個(gè)請(qǐng)求,放入一個(gè)事件列表,讓主進(jìn)程通過非阻塞I/O方式來處理請(qǐng)求
上面的幾種方式,各有千秋,
第(1)中方法,由于創(chuàng)建新的進(jìn)程的開銷比較大,所以,會(huì)導(dǎo)致服務(wù)器性能比較差,但實(shí)現(xiàn)比較簡(jiǎn)單。
第(2)種方式,由于要涉及到線程的同步,有可能會(huì)面臨死鎖等問題。
第(3)種方式,在寫應(yīng)用程序代碼時(shí),邏輯比前面兩種都復(fù)雜。
綜合考慮各方面因素,一般普遍認(rèn)為第(3)種方式是大多數(shù)網(wǎng)絡(luò)服務(wù)器采用的方式

看圖說話講事件驅(qū)動(dòng)模型

在UI編程中,常常要對(duì)鼠標(biāo)點(diǎn)擊進(jìn)行相應(yīng),首先如何獲得鼠標(biāo)點(diǎn)擊呢?
方式一:創(chuàng)建一個(gè)線程,該線程一直循環(huán)檢測(cè)是否有鼠標(biāo)點(diǎn)擊,那么這個(gè)方式有以下幾個(gè)缺點(diǎn)
1. CPU資源浪費(fèi),可能鼠標(biāo)點(diǎn)擊的頻率非常小,但是掃描線程還是會(huì)一直循環(huán)檢測(cè),這會(huì)造成很多的CPU資源浪費(fèi);如果掃描鼠標(biāo)點(diǎn)擊的接口是阻塞的呢?
2. 如果是堵塞的,又會(huì)出現(xiàn)下面這樣的問題,如果我們不但要掃描鼠標(biāo)點(diǎn)擊,還要掃描鍵盤是否按下,由于掃描鼠標(biāo)時(shí)被堵塞了,那么可能永遠(yuǎn)不會(huì)去掃描鍵盤;
3. 如果一個(gè)循環(huán)需要掃描的設(shè)備非常多,這又會(huì)引來響應(yīng)時(shí)間的問題;
所以,該方式是非常不好的。

方式二:就是事件驅(qū)動(dòng)模型
目前大部分的UI編程都是事件驅(qū)動(dòng)模型,如很多UI平臺(tái)都會(huì)提供onClick()事件,這個(gè)事件就代表鼠標(biāo)按下事件。事件驅(qū)動(dòng)模型大體思路如下:
1. 有一個(gè)事件(消息)隊(duì)列;
2. 鼠標(biāo)按下時(shí),往這個(gè)隊(duì)列中增加一個(gè)點(diǎn)擊事件(消息);
3. 有個(gè)循環(huán),不斷從隊(duì)列取出事件,根據(jù)不同的事件,調(diào)用不同的函數(shù),如onClick()、onKeyDown()等;
4. 事件(消息)一般都各自保存各自的處理函數(shù)指針,這樣,每個(gè)消息都有獨(dú)立的處理函數(shù);

 

 

事件驅(qū)動(dòng)編程是一種編程范式,這里程序的執(zhí)行流由外部事件來決定。它的特點(diǎn)是包含一個(gè)事件循環(huán),當(dāng)外部事件發(fā)生時(shí)使用回調(diào)機(jī)制來觸發(fā)相應(yīng)的處理。另外兩種常見的編程范式是(單線程)同步以及多線程編程。

讓我們用例子來比較和對(duì)比一下單線程、多線程以及事件驅(qū)動(dòng)編程模型。下圖展示了隨著時(shí)間的推移,這三種模式下程序所做的工作。這個(gè)程序有3個(gè)任務(wù)需要完成,每個(gè)任務(wù)都在等待I/O操作時(shí)阻塞自身。阻塞在I/O操作上所花費(fèi)的時(shí)間已經(jīng)用灰色框標(biāo)示出來了。

 

在單線程同步模型中,任務(wù)按照順序執(zhí)行。如果某個(gè)任務(wù)因?yàn)镮/O而阻塞,其他所有的任務(wù)都必須等待,直到它完成之后它們才能依次執(zhí)行。這種明確的執(zhí)行順序和串行化處理的行為是很容易推斷得出的。如果任務(wù)之間并沒有互相依賴的關(guān)系,但仍然需要互相等待的話這就使得程序不必要的降低了運(yùn)行速度。

在多線程版本中,這3個(gè)任務(wù)分別在獨(dú)立的線程中執(zhí)行。這些線程由操作系統(tǒng)來管理,在多處理器系統(tǒng)上可以并行處理,或者在單處理器系統(tǒng)上交錯(cuò)執(zhí)行。這使得當(dāng)某個(gè)線程阻塞在某個(gè)資源的同時(shí)其他線程得以繼續(xù)執(zhí)行。與完成類似功能的同步程序相比,這種方式更有效率,但程序員必須寫代碼來保護(hù)共享資源,防止其被多個(gè)線程同時(shí)訪問。多線程程序更加難以推斷,因?yàn)檫@類程序不得不通過線程同步機(jī)制如鎖、可重入函數(shù)、線程局部存儲(chǔ)或者其他機(jī)制來處理線程安全問題,如果實(shí)現(xiàn)不當(dāng)就會(huì)導(dǎo)致出現(xiàn)微妙且令人痛不欲生的bug。

在事件驅(qū)動(dòng)版本的程序中,3個(gè)任務(wù)交錯(cuò)執(zhí)行,但仍然在一個(gè)單獨(dú)的線程控制中。當(dāng)處理I/O或者其他昂貴的操作時(shí),注冊(cè)一個(gè)回調(diào)到事件循環(huán)中,然后當(dāng)I/O操作完成時(shí)繼續(xù)執(zhí)行?;卣{(diào)描述了該如何處理某個(gè)事件。事件循環(huán)輪詢所有的事件,當(dāng)事件到來時(shí)將它們分配給等待處理事件的回調(diào)函數(shù)。這種方式讓程序盡可能的得以執(zhí)行而不需要用到額外的線程。事件驅(qū)動(dòng)型程序比多線程程序更容易推斷出行為,因?yàn)槌绦騿T不需要關(guān)心線程安全問題。

當(dāng)我們面對(duì)如下的環(huán)境時(shí),事件驅(qū)動(dòng)模型通常是一個(gè)好的選擇:

  1. 程序中有許多任務(wù),而且…
  2. 任務(wù)之間高度獨(dú)立(因此它們不需要互相通信,或者等待彼此)而且…
  3. 在等待事件到來時(shí),某些任務(wù)會(huì)阻塞。

當(dāng)應(yīng)用程序需要在任務(wù)間共享可變的數(shù)據(jù)時(shí),這也是一個(gè)不錯(cuò)的選擇,因?yàn)檫@里不需要采用同步處理。

網(wǎng)絡(luò)應(yīng)用程序通常都有上述這些特點(diǎn),這使得它們能夠很好的契合事件驅(qū)動(dòng)編程模型。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多