day13學python 協程 事件驅動

2022-09-13 19:15:15 字數 2719 閱讀 7555

當排程切換時 靠暫存器上下文和棧儲存 要使用時再呼叫(即可不會因io傳輸資料卡殼 從而耗時無法繼續進行)實現並行

1 無需同執行緒上下文切換 消耗cpu

2 修改資料無需加鎖(協程都是單執行緒序列 無需加鎖)

3 cpu支援大量協程

1無法呼叫多核資源(本身是單執行緒)  --指的是cpu只用單核運作 

接下來介紹兩種協程切換的 模板與方法

1.greenlet協程切換(手動擋)

2.gevent協程切換(自動擋)

import

greenlet

deftest1():

print(1)

gr2.switch()

print(3)

gr2.switch()

deftest2():

print(2)

gr1.switch()

print(4)

if__name__=='

__main__':

gr1=greenlet.greenlet(test1) #

啟動協程 函式名作為引數

gr2=greenlet.greenlet(test2)

gr1.switch()

注意1 需要呼叫到另一函式時 用函式協程的switch函式  

2 gr1=greenlet.greenlet(test1)     #呼叫greenlet函式 啟動協程 函式名作為引數

3 呼叫順序

①main函式例項化並啟動執行緒務必隨後進入協程 上例為進入test1()-->gr1.switch()

②當遇到gr2.switch() 語句 將從test1函式轉為執行test2函式 

③最後按順序執行輸出1 2 3 4

import

gevent

from gevent import

monkey

monkey.patch_all()

#把當前程式所有的io操作都單獨做上標記

deff1():

print(1)

gevent.sleep(5) #

gevent中的休眠函式 模擬io操作長耗時 當協程遇到io即向下切換

print(5)

deff2():

print(2)

gevent.sleep(3) #

遇到io繼續向下切換 如若都有io 則反覆切換 直到時間結束

print(4)

deff3():

print(3)

gevent.sleep(0)

#即使0秒 也代表切換協程訊號

print(3.1)

gevent.joinall([

gevent.spawn(f1),

#啟動協程,以列表形式儲存

gevent.spawn(f2),

gevent.spawn(f3)

])

注意:1 gevent為第三方庫 已對實現併發,同步、非同步程式設計進行封裝 (推薦使用)

2 原理:當遇到i/o操作將

自動切換 進行下一協程的執行 若還有i/o則再向下 隨後再從頭迴圈   如若都有i/o 則反覆切換 直到時間結束 

目的:①節省時間 最終花費最長協程消耗的時間

②節約記憶體,記憶體消耗遠小於程序交替

3   from gevent importmonkey

monkey.patch_all()      //這兩句把當前程式所有的i/o操作都單獨做上標記--運用與基本網路爬蟲中(或那些不會被系統直接認出i/o操作的語句)

4gevent的例項化:

gevent.joinall([

gevent.spawn(f1),         # 加入協程,以列表形式儲存

gevent.spawn(f2),      #呼叫gevent.joinall(列表) 

gevent.spawn(f3)      #gevent.spawn(f2), 啟動協程  亦可再其後補充引數---spawn(函式名,『引數』)

])5     gevent.sleep(5)     #gevent中的休眠函式 模擬i/o操作長耗時 (當協程遇到i/o即向下切換)

gevent.sleep(0)     #即使0秒 也代表切換協程切換訊號  因此向下切換協程

定義:通常 在收到乙個請求後,放入乙個事件列表,讓主程序通過非阻塞i/o的方式來處理資訊

舉個例子:

模擬滑鼠鍵盤輸入時,常常要對滑鼠點選進行相應,首先如何獲得滑鼠點選呢?

運用事件驅動的思想:

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

2. 滑鼠按下時,往這個佇列中增加乙個點選事件(訊息)--隨後繼續等待接收滑鼠下一次點選(避免卡頓)

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

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

注意:1 左側事件源 只管理自己專案 (例:滑鼠,鍵盤輸入) 接收到後丟給佇列 自己繼續接收

2 右側處理執行緒一步步去取得 不同任務並呼叫對應函式解決

好處: 避免cpu資源浪費 若乙個執行緒堵塞 無法進行其他操作(簡稱卡機)因此使用協程

python之路 day13 模組

1,什麼是模組 模組就是系統功能的集合體,在python中,乙個py檔案就是乙個模組,例如 module.py 其中module叫做模組名 2,使用模組 2.1 import匯入模組 首次帶入模組發生三件事 1,建立乙個模組的命名空間 2,執行模組對應檔案,將產生的名字存放於1中的命名空間 3,在當...

Python學習日記 Day13異常

今天是2020年2月22日,晴,4 16 每當遇到python直譯器無法處理的錯誤時,都會建立乙個異常物件。若沒有對異常進行處理,則程式會停止執行,並顯示乙個 traceback 資訊 若編寫了處理異常的 程式就能按 處理異常,並繼續執行。1 try except 塊 python中使用 try e...

Python 多工(程序) day1(3)

程序間的通訊 可以用socket進行程序間的通訊 可以用同一檔案來進行通訊,即在同乙個檔案中進行讀寫操作的交流 但是在硬碟上讀取和寫入比較慢,記憶體執行太快了 queue佇列 記得是佇列 在同一記憶體中通訊 因為程序之間不能共享全域性變數,所以通過建立佇列,把佇列當成實參傳入函式 multiproc...