1. 程式人生 > >單執行緒、多執行緒以及事件驅動程式設計模型對比

單執行緒、多執行緒以及事件驅動程式設計模型對比

中文版全文:http://blog.csdn.net/hanhuili/article/details/9389433#comments

事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來觸發相應的處理。另外兩種常見的程式設計正規化是(單執行緒)同步以及多執行緒程式設計。

讓我們用例子來比較和對比一下單執行緒、多執行緒以及事件驅動程式設計模型。圖21.1展示了隨著時間的推移,這三種模式下程式所做的工作。這個程式有3個任務需要完成,每個任務都在等待I/O操作時阻塞自身。阻塞在I/O操作上所花費的時間已經用灰色框標示出來了。

圖21.1 執行緒模型

在單執行緒同步模型中,任務按照順序執行。如果某個任務因為I/O而阻塞,其他所有的任務都必須等待,直到它完成之後它們才能依次執行。這種明確的執行順序和序列化處理的行為是很容易推斷得出的。如果任務之間並沒有互相依賴的關係,但仍然需要互相等待的話這就使得程式不必要的降低了執行速度。

在多執行緒版本中,這3個任務分別在獨立的執行緒中執行。這些執行緒由作業系統來管理,在多處理器系統上可以並行處理,或者在單處理器系統上交錯執行。這使得當某個執行緒阻塞在某個資源的同時其他執行緒得以繼續執行。與完成類似功能的同步程式相比,這種方式更有效率,但程式設計師必須寫程式碼來保護共享資源,防止其被多個執行緒同時訪問。多執行緒程式更加難以推斷,因為這類程式不得不通過執行緒同步機制如鎖、可重入函式、執行緒區域性儲存或者其他機制來處理執行緒安全問題,如果實現不當就會導致出現微妙且令人痛不欲生的bug。

在事件驅動版本的程式中,3個任務交錯執行,但仍然在一個單獨的執行緒控制中。當處理I/O或者其他昂貴的操作時,註冊一個回撥到事件迴圈中,然後當I/O操作完成時繼續執行。回撥描述了該如何處理某個事件。事件迴圈輪詢所有的事件,當事件到來時將它們分配給等待處理事件的回撥函式。這種方式讓程式儘可能的得以執行而不需要用到額外的執行緒。事件驅動型程式比多執行緒程式更容易推斷出行為,因為程式設計師不需要關心執行緒安全問題。

當我們面對如下的環境時,事件驅動模型通常是一個好的選擇:

  1. 程式中有許多工,而且…
  2. 任務之間高度獨立(因此它們不需要互相通訊,或者等待彼此)而且…
  3. 在等待事件到來時,某些任務會阻塞。

當應用程式需要在任務間共享可變的資料時,這也是一個不錯的選擇,因為這裡不需要採用同步處理。

網路應用程式通常都有上述這些特點,這使得它們能夠很好的契合事件驅動程式設計模型。

相關推薦

執行執行以及事件驅動程式設計模型對比

中文版全文:http://blog.csdn.net/hanhuili/article/details/9389433#comments 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來

執行執行以及執行安全個人理解

在這裡,我不對多執行緒原理在做闡述。想了解的讀者可以參考:這裡,我將抽象的概念具體化,通過和尚挑水的故事對多執行緒做解釋。1、首先定義和尚類Monkpackage com.stu.thread; /** * 和尚類 * @author jj * */ public

Python中執行執行程序的效率對比實驗

Python是執行在直譯器中的語言,查詢資料知道,python中有一個全域性鎖(GIL),在使用多程序(Thread)的情況下,不能發揮多核的優勢。而使用多程序(Multiprocess),則可以發揮多核的優勢真正地提高效率。 對比實驗 資料顯示,如果多執行緒的程序是CPU密集型的,那多執行緒並不能有多少

認識程序執行執行

要認識多執行緒就要從作業系統的原理說起。   以前古老的DOS作業系統(V 6.22)是單任務的,還沒有執行緒的概念,系統在每次只能做一件事情。比如你在copy東西的時候不能rename檔名。為了提高系統的利用效率,採用批處理來批量執行任務。   現在的作業系統都是多工作業

C# 基礎(十四)C#例模式:首先介紹 執行執行加鎖 例模式。然後介紹例模式的執行同步:執行有序訪問共享記憶體。

一、簡介 本篇文章將介紹如何使用單例模式,也就是類的例項化,在整個專案的生命週期內,只例項化一次。在單例模式中,往往可以看到如SourceCode.cs:這樣的結構的。 SourceCode.cs: public class Singleton { private static

CPU如何執行程序執行,他們之間的關係是怎樣的

  好文章分享,轉自:https://www.cnblogs.com/csfeng/p/8670704.html 當面臨這些問題的時候,有兩個關鍵詞無法繞開,那就是並行和併發。 首先,要先了解幾個概念:   1、程序是程式的一次執行。   2、程序是資源分配的基本單位(

程序執行執行相關總結

一、說說概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。 簡單的來講程序

執行執行執行池面試專題

極力推薦文章:歡迎收藏 Android 乾貨分享 閱讀五分鐘,每日十點,和您一起終身學習,這裡是程式設計師Android 本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容: 1、開啟執行緒的三種方式? 1)繼承Thread類,重寫run()方法,在run()方法

執行程序之比較,以及三種執行模型

工作幾年找工作幾乎總會被問,從最開始的從網上看答案,到現在憑自己的經驗去說,這個問題似乎也是經驗積累的一個驗證,最近沒事就總結一下吧: 程序和執行緒的定義、比較等: 程序:處於活動狀態的計算機程式。程序就是在作業系統中       執行特定的任務,程序針對

水滴石穿--執行原子操作threadlocalvolatile執行下的例模式

接著上一篇文章,下面看看幾個比較好理解的知識點!! volatile java關鍵字volatile修飾的變數從字面意義上理解易變的,不穩定的,事實上時告訴編譯器該變數是易變的不要對該變數使用快取等級的優化,每次都從記憶體地址中讀取值。 不過並沒有說明在對volatile修飾的變數進行修

執行基礎概念實現執行三種方法中斷執行方法,以及執行狀態轉化

1、CPU核心數和執行緒數的關係 1:1的關係,引入超執行緒之後,就是1:2 2、cpu時間輪轉機制,即RR排程 3、程序和執行緒 程序:程式執行資源分配最小單位,程序內部有多個執行緒,多個執行緒之間會共享程序資源 執行緒:CPU排程的最小單位 4、並行和併發

零基礎學python:併發伺服器面向連線程序執行程序

面向連線的併發伺服器 只能同時為一個人服務 為了幫助小夥伴們更好的學習Python,小編整理了Python的相關學習視訊及學習路線圖; ,新增小編學習群943752371即可獲取 多程序併發伺服器 多程序伺服器代表:Apache伺服器 主程序中必需

併發程式設計並行執行同步非同步執行執行阻塞io非阻塞io

一、 cpu的每一個核在同一時間下,只能執行一個執行緒,就是單核同一時間只能執行一個執行緒 而cpu可以不停的切換,這樣就導致使用者感覺可以執行多個執行緒,這是併發,而不是並行 併發和並行 你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支

Python執行程序和協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

併發伺服器的實現(程序執行...)

一、多程序實現併發伺服器 程式碼如下:multiprocess_server.c /* ============================================================================ Name : TCPServ

Java 知識 - 集合執行IOJVM

GitHub 專案地址 Collection Java Collection 新增、刪除等操作時可選操作,如 Arrays.asList,會產生固定大小的集合,會丟擲 UnsupportedOperationException Set HashSet、TreeSet、LinkedH

第六章例模式與執行——立即載入“餓漢模式”與延遲載入“懶漢模式”

立即載入就是使用類的時候已經將物件建立完畢了,也稱為“餓漢模式” package test01; public class MyObject { // 建立物件 private static MyObject object = new MyObject(); private MyObjec

SimpleDateFormat時間格式化高併發執行時出現問題

SimpleDateFormat是是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但是DateFormat 和 SimpleDateFormat 類不都是執行緒安全的,在生產環境的多執行緒或高併發情況使用 format() 和 parse() 方法,會出現很多問題:

程序執行執行基本概念

程序、執行緒和多執行緒基本概念 一、概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。

執行實現簡單的socket通訊例項(TCP)

1.伺服器端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @createTime:2018/