1. 程式人生 > >基於事件驅動的併發程式設計

基於事件驅動的併發程式設計

  • 同步與非同步
    • 同步和非同步關注的是訊息通訊機制 (synchronous communication/ asynchronous communication)
    • 所謂同步,就是在發出一個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由呼叫者主動等待這個呼叫的結果。
    • 而非同步則是相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。
    • 阻塞與非阻塞
    • 阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.
    • 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
    • 非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。
  • 一般來說I/O模型可以分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞IO
    •  同步阻塞IO: 
      • 在此種方式下,使用者程序在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,使用者程序才能執行。JAVA傳統的IO模型屬於此種方式!
    • 同步非阻塞IO: 
      • 在此種方式下,使用者程序發起一個IO操作以後邊可返回做其它事情,但是使用者程序需要時不時的詢問IO操作是否就緒,這就要求使用者程序不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。
    • 非同步阻塞IO:
      • 此種方式下是指應用發起一個IO操作以後,不等待核心IO操作的完成,等核心完成IO操作以後會通知應用程式,這其實就是同步和非同步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼為什麼說是阻塞的呢?因為此時(通知)是通過select系統呼叫來完成的,而select函式本身的實現方式是阻塞的,而採用select函式有個好處就是它可以同時監聽多個檔案控制代碼(就緒的沒有就緒的都有監聽,epoll是select的替代方式,只監聽就緒的檔案控制代碼),從而提高系統的併發性!
    • 非同步非阻塞IO:
      • 在此種模式下,使用者程序只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程式會得到IO操作完成的通知,此時使用者程序只需要對資料進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經由核心完成了。目前Java中還沒有支援此種IO模型。
  • 非同步事件驅動
    • 如果我們的業務邏輯處理使用非同步事件驅動(Reactor)的方式,而又需要在本次請求中需要返回請求結果,此時屬於同步獲取返回值,因此此時我們只能使用阻塞非同步或者“併發”“同步”的方式。
    • 如果該次請求不需要同步獲取返回值,此時我們即可使用阻塞非同步(Reactor)方式,也可以結合使用DeferredResult非同步結果返回。

image.png

相關推薦

基於事件驅動併發程式設計

同步與非同步 同步和非同步關注的是訊息通訊機制 (synchronous communication/ asynchronous communication) 所謂同步,就是在發出一個呼叫時,在沒有

基於事件驅動過程鏈理論的SAP項目實施

任務 res p s 數據庫 chain tle 理解 用戶 靜態資源 基於事件驅動過程鏈理論的SAP地產項目實施研究 一、事件驅動過程鏈模型(EPC)的含義事件驅動過程鏈模型(Event‐Driven Process Chain)通過智能化的流程路徑,根據既定的原則和權限

myReactorServer: 基於事件驅動的C++高性能服務器

字符 mage 連接 服務 異步 form muduo nbsp 結果 myReactorServer: A High Performance C++ Web Server 項目地址 myReactorServer 性能評估結果 身為一個Web Server,最

myReactorServer: 基於事件驅動的C++高效能伺服器

myReactorServer: A High Performance C++ Web Server 專案地址 效能評估結果   身為一個Web Server,最重要的當然還是效能表現。所以不廢話,先上效能評估結果。   由於這個專案借鑑了muduo專案的架構,所以效能對比的物件主要就是muduo。 測

單一工作流的執行➕回滾框架初步想法(基於事件驅動模式)

思路來源: 事件驅動框架。   Part 1. 定義一個框架 event_flow.py  (需要再改動) 1 #! /usr/bin/env python 2 3 4 deploy_phase_list = [] 5 6 def deploy

asp.net---基於事件驅動開發

事件驅動開發簡單應用 建立Web窗體 runat=”server” 大概翻譯 – 跑在服務 控制元件拖放,不需認為的繪製”HTML”程式碼 給按鈕新增事件,只需瀟灑雙擊,並且直接編寫

【NodeJS】深入理解Node.js基於事件驅動的回撥

回撥和非同步呼叫的關係   首先明確一點,回撥並非是非同步呼叫,回撥是一種解決非同步函式執行結果的處理方法。在非同步呼叫,如果我們希望將執行的結果返回並且處理時,可以通過回撥的方法解決。為了能夠更好的區分回撥和非同步回撥的區別,我們來看一個簡單的例子,程式碼如

node.js 基於事件驅動的回撥

基於事件驅動的回撥 當我們使用 http.createServer 方法的時候,我們當然不只是想要一個偵聽某個埠的伺服器,我們還想要它在伺服器收到一個HTTP請求的時候做點什麼。 問題是,這是非同步的:請求任何時候都可能到達,但是我們的伺服器卻跑在一個單程序中。 寫

Linux基於事件驅動的程式框架(轉載)

[轉]Linux 2.6 核心Epoll用法舉例說明 epoll用到的所有函式都是在標頭檔案sys/epoll.h中宣告的,下面簡要說明所用到的資料結構和函式: 所用到的資料結構: typedef union epoll_data { vo

linux inotify 監控檔案系統事件(incron,基於事件驅動的cron- )

原文地址: http://www.51know.info/system_security/inotify.html 1. Inotify 機制概述 1.1. Inotify 介紹 在日常的運維過程中,經常需要備份某些檔案,或者對系統的某些檔案進行監控,比如重要的

node:基於事件驅動的回撥

那麼在我們的Node.js程式中,當一個新的請求到達8888埠的時候,我們怎麼控制流程呢? 嗯,這就是Node.js/JavaScript的事件驅動設計能夠真正幫上忙的地方了——雖然我們還得學一些新概念才能掌握它。讓我們來看看這些概念是怎麼應用在我們的伺服器程式碼裡的。 我們建立了伺服器,並且向建立它

Spring基於事件驅動模型的訂閱釋出模式程式碼例項詳解

事件驅動模型簡介 事件驅動模型也就是我們常說的觀察者,或者釋出-訂閱模型;理解它的幾個關鍵點: 首先是一種物件間的一對多的關係;最簡單的如交通訊號燈,訊號燈是目標(一方),行人注視著訊號燈(多方);當目標傳送改變(釋出),觀察者(訂閱者)就可以接收到改變;觀察者如何處理

使用EventNext實現基於事件驅動的業務處理

事件驅動模型相信對大家來說並不陌生,因為這是一套非常高效的邏輯處理模型,通過事件來驅動接下來需要完成的工作,而不像傳統同步模型等待任務完成後再繼續!雖然事件驅動有著這樣的好處,但在傳統設計上基於訊息回撥的處理方式在業務處理中相對比較麻煩整體設計成本也比較高,所以落地也不容易。EventNext是一個事件驅動的

Java事件驅動程式設計

**********************事件驅動程式設計*************************** 一.基本概念 由使用者發出某個事件,驅動某段程式碼執行,叫做事件驅動程式設計 1. 事件源 誰發出了這個事件,事件的來源 單擊按鈕 事件源:按鈕 視窗關閉 視窗 電話響鈴 電話

基於JVM原理、JMM模型和CPU快取模型深入理解Java併發程式設計

許多以Java多執行緒開發為主題的技術書籍,都會把對Java虛擬機器和Java記憶體模型的講解,作為講授Java併發程式設計開發的主要內容,有的還深入到計算機系統的記憶體、CPU、快取等予以說明。實際上,在實際的Java開發工作中,僅僅瞭解併發程式設計的建立、啟動、管理和通訊等基本知識還是不夠的。一

面向過程-事件驅動程式設計-訊息機制【VC MFC】

面向過程的MS-DOS程式設計:   傳統的DOS程式都有而且只有一個main函式,可以在main函式中呼叫其它的函式,完成各種各樣的功能和過程。所有函式的呼叫以及執行都是按照使用者預定好的順序進行的。   在面向過程的程式中,整個程式按照一定順序進行;它是一系列

java丨事件驅動程式設計學習筆記(二)

一、匿名監聽器 監聽器類是特意為建立一個GUI元件(例如,一個按鈕)而設計的監聽物件。監聽器類不被其他應用程式所共享,因此,正確的做法是將它作為一個內部類定義在框架中。 可以使用匿名內部類簡化內部類監聽器。匿名內部類時沒有名字的內部類。它進一步完成定義內部類和建立一個該類的例項。 內部類Enlarg

基於JVM原理JMM模型和CPU快取模型深入理解Java併發程式設計

許多以Java多執行緒開發為主題的技術書籍,都會把對Java虛擬機器和Java記憶體模型的講解,作為講授Java併發程式設計開發的主要內容,有的還深入到計算機系統的記憶體、CPU、快取等予以說明。實際上,在實際的Java開發工作中,僅僅瞭解併發程式設計的建立、啟動、管理和通訊等基本知識還是不夠的。一方面,如果

基於redis的分散式鎖 | 併發程式設計

1 介紹 這篇博文講介紹如何一步步構建一個基於Redis的分散式鎖。會從最原始的版本開始,然後根據問題進行調整,最後完成一個較為合理的分散式鎖。 本篇文章會將分散式鎖的實現分為兩部分,一個是單機環境,另一個是叢集環境下的Redis鎖實現。在介紹分散式鎖的實現之前,先來了解下分散式鎖的一些資訊。 2 分散式

java丨事件驅動程式設計學習筆記(一)

一、事件和事件源 事件:事件可以定義為程式發生了某些事情的訊號 源物件(源元件):能建立一個事件並觸發該事件的元件成為源物件 事件類的根類:java.util.EventObject 可以使用EventObject類中的例項方法getSource()獲得事件的源物件 如果一