Python 事件驅動了解

2022-05-18 10:42:08 字數 1667 閱讀 1582

gevent協程可實現自動切換,協程在遇到io時會進行切換,到另外乙個請求,那協程是如何得知在什麼時候在切換回去呢?

通常,我們寫伺服器處理模型的程式時,有以下幾種模型:

(1)每收到乙個請求,建立乙個新的程序,來處理該請求;

(2)每收到乙個請求,建立乙個新的執行緒,來處理該請求;

(3)每收到乙個請求,放入乙個事件列表,讓主程序通過非阻塞i/o方式來處理請求

上面的幾種方式,各有千秋:

第(1)中方法,由於建立新的程序的開銷比較大,所以,會導致伺服器效能比較差,但實現比較簡單。

第(2)種方式,由於要涉及到執行緒的同步,有可能會面臨死鎖等問題。

第(3)種方式,在寫應用程式**時,邏輯比前面兩種都複雜。

綜合考慮各方面因素,一般普遍認為第(3)種方式是大多數網路伺服器採用的方式。

在ui程式設計中,常常要對滑鼠點選進行相應,首先如何獲得滑鼠點選呢?

方式一:建立乙個執行緒,該執行緒一直迴圈檢測是否有滑鼠點選,那麼這個方式有以下幾個缺點:

1. cpu資源浪費,可能滑鼠點選的頻率非常小,但是掃瞄線程還是會一直迴圈檢測,這會造成很多的cpu資源浪費;如果掃瞄滑鼠點選的介面是阻塞的呢?

2. 如果是堵塞的,又會出現下面這樣的問題,如果我們不但要掃瞄滑鼠點選,還要掃瞄鍵盤是否按下,由於掃瞄滑鼠時被堵塞了,那麼可能永遠不會去掃瞄鍵盤;

3. 如果乙個迴圈需要掃瞄的裝置非常多,這又會引來響應時間的問題;

注:該方式是非常不好的。

方式二:就是事件驅動模型

目前大部分的ui程式設計都是事件驅動模型,如很多ui平台都會提供onclick(滑鼠)事件,這個事件就代表滑鼠按下事件。事件驅動模型大體思路如下:

1. 有乙個事件(訊息)佇列;

2. 滑鼠按下時,往這個佇列中增加乙個點選事件(訊息);

3. 有個迴圈,不斷從佇列取出事件,根據不同的事件,呼叫不同的函式,如onclick(滑鼠)、onkeydown(鍵盤)等;

4. 事件(訊息)一般都各自儲存各自的處理函式指標,這樣,每個訊息都有獨立的處理函式;

# 網路程式設計正規化 根據事件發生進行相應處理。

# 其他正規化:單執行緒同步、多執行緒程式設計。

當乙個事件進入,放入到列表佇列內註冊任務,如果這個事件處理需要5秒鐘,協程會在去處理第二個事件也放入佇列內,通過乙個不斷檢測事件的執行緒來處理相應的事件。這個處理機制是由外部事件如滑鼠,鍵盤來產生,他的特點是包含乙個事件迴圈,當外部事件發生時使用**機制來觸發相應的處理。**主要是執行執行緒處理完畢時在次進行的理,同時告訴協程這個事情處理完畢,事件進入註冊任務時同時會加乙個**函式,這個**內容可以自定義。

紅色(任務1) 、藍色(任務2) 、黃色(任務3) 、灰色(io處理)

這裡我們用到了三種程式設計正規化,分別是執行緒,程序,協程,可以清晰的看出執行緒用的時間最長效率低,程序雖然效率高但消耗資源,協程分開切換io處理,提高效率並節省資源,將cpu與io單獨進行處理,cpu只負責計算,通過乙個執行緒把io交給作業系統,並**結果與協程在次互動。

以ADC裝置驅動了解設計流程

module bus char mknod resource hardware noblock signal lock sem module include include int init adc init void void exit adc exit void module init adc ...

python事件驅動框架 Python幾種主流框架

從github中整理出的15個最受歡迎的python開源框架。這些框架包括事件i o,olap,web開發,高效能網路通訊,測試,爬蟲等。django python web應用開發框架 django 應該是最出名的python框架,gae甚至erlang都有框架受它影響。django是走大而全的方向...

python 事件驅動程式設計模型

event input button和text box keyboard key down和key up mouse click 和 drag timer event queue 所有的event都按照發生的先後順序存在event queue裡,先發生的event,就先執行對應的event hand...