基于事件驅(qū)動的并發(fā)編程

  • 同步與異步
    • 同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)
    • 所謂同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。但是一旦調(diào)用返回,就得到返回值了。換句話說,就是由調(diào)用者主動等待這個調(diào)用的結(jié)果。
    • 而異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當一個異步過程調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。
  • 阻塞與非阻塞
    • 阻塞和非阻塞關注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài).
    • 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。
    • 非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當前線程。
  • 一般來說I/O模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞IO
    • 同步阻塞IO:
      • 在此種方式下,用戶進程在發(fā)起一個IO操作以后,必須等待IO操作的完成,只有當真正完成了IO操作以后,用戶進程才能運行。JAVA傳統(tǒng)的IO模型屬于此種方式!
    • 同步非阻塞IO:
      • 在此種方式下,用戶進程發(fā)起一個IO操作以后邊可返回做其它事情,但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬于同步非阻塞IO。
    • 異步阻塞IO:
      • 此種方式下是指應用發(fā)起一個IO操作以后,不等待內(nèi)核IO操作的完成,等內(nèi)核完成IO操作以后會通知應用程序,這其實就是同步和異步最關鍵的區(qū)別,同步必須等待或者主動的去詢問IO是否完成,那么為什么說是阻塞的呢?因為此時(通知)是通過select系統(tǒng)調(diào)用來完成的,而select函數(shù)本身的實現(xiàn)方式是阻塞的,而采用select函數(shù)有個好處就是它可以同時監(jiān)聽多個文件句柄(就緒的沒有就緒的都有監(jiān)聽,epoll是select的替代方式,只監(jiān)聽就緒的文件句柄),從而提高系統(tǒng)的并發(fā)性!
    • 異步非阻塞IO:
      • 在此種模式下,用戶進程只需要發(fā)起一個IO操作然后立即返回,等IO操作真正的完成以后,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數(shù)據(jù)進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經(jīng)由內(nèi)核完成了。目前Java中還沒有支持此種IO模型。
  • 異步事件驅(qū)動
    • 如果我們的業(yè)務邏輯處理使用異步事件驅(qū)動(Reactor)的方式,而又需要在本次請求中需要返回請求結(jié)果,此時屬于同步獲取返回值,因此此時我們只能使用阻塞異步或者“并發(fā)”“同步”的方式。
    • 如果該次請求不需要同步獲取返回值,此時我們即可使用阻塞異步(Reactor)方式,也可以結(jié)合使用DeferredResult異步結(jié)果返回。

個人介紹:

高廣超 :多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設計經(jīng)驗,擅長設計與落地高可用、高性能互聯(lián)網(wǎng)架構(gòu)。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容