一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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

 liang1234_ 2019-02-05

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

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

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

在UI編程中,常常要對鼠標(biāo)點(diǎn)擊進(jìn)行相應(yīng),首先如何獲得鼠標(biāo)點(diǎn)擊呢?
方式一:創(chuàng)建一個(gè)線程,該線程一直循環(huán)檢測是否有鼠標(biāo)點(diǎn)擊,那么這個(gè)方式有以下幾個(gè)缺點(diǎn)
1. CPU資源浪費(fèi),可能鼠標(biāo)點(diǎn)擊的頻率非常小,但是掃描線程還是會(huì)一直循環(huán)檢測,這會(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平臺都會(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)的處理。另外兩種常見的編程范式是(單線程)同步以及多線程編程。

讓我們用例子來比較和對比一下單線程、多線程以及事件驅(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ù)、線程局部存儲或者其他機(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í),注冊一個(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)我們面對如下的環(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è)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    国内尹人香蕉综合在线| 国产欧美一区二区久久| 国产内射一级一片内射高清| 中文字幕人妻一区二区免费| 日本加勒比中文在线观看| 中文字幕免费观看亚洲视频 | 日本在线高清精品人妻| 亚洲高清中文字幕一区二三区| 亚洲淫片一区二区三区| 嫩草国产福利视频一区二区| 欧美不卡一区二区在线视频| 欧美精品日韩精品一区| 欧美av人人妻av人人爽蜜桃| 国内外免费在线激情视频| 亚洲精品黄色片中文字幕| 午夜福利在线观看免费| 国产主播精品福利午夜二区| 久久精品中文扫妇内射| 好骚国产99在线中文| 欧美日韩精品久久第一页 | 成人欧美精品一区二区三区| 亚洲熟妇av一区二区三区色堂| 少妇特黄av一区二区三区| 丰满少妇被猛烈插入在线观看| 麻豆印象传媒在线观看| 欧美一区二区三区喷汁尤物| 国语久精品在视频在线观看| 色无极东京热男人的天堂| 婷婷九月在线中文字幕| 亚洲国产香蕉视频在线观看| 欧美人禽色视频免费看| 尤物久久91欧美人禽亚洲| 精品日韩视频在线观看| 欧美日韩精品人妻二区三区| 成人午夜激情在线免费观看| 亚洲最新中文字幕在线视频| 开心激情网 激情五月天| 91精品国产综合久久精品| 人妻少妇久久中文字幕久久| 青青操视频在线播放免费| 午夜福利黄片免费观看|