當排程切換時 靠暫存器上下文和棧儲存 要使用時再呼叫(即可不會因io傳輸資料卡殼 從而耗時無法繼續進行)實現並行
1 無需同執行緒上下文切換 消耗cpu
2 修改資料無需加鎖(協程都是單執行緒序列 無需加鎖)
3 cpu支援大量協程
1無法呼叫多核資源(本身是單執行緒) --指的是cpu只用單核運作
接下來介紹兩種協程切換的 模板與方法
1.greenlet協程切換(手動擋)
2.gevent協程切換(自動擋)
import注意1 需要呼叫到另一函式時 用函式協程的switch函式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()
2 gr1=greenlet.greenlet(test1) #呼叫greenlet函式 啟動協程 函式名作為引數
3 呼叫順序
①main函式例項化並啟動執行緒務必隨後進入協程 上例為進入test1()-->gr1.switch()
②當遇到gr2.switch() 語句 將從test1函式轉為執行test2函式
③最後按順序執行輸出1 2 3 4
import注意:1 gevent為第三方庫 已對實現併發,同步、非同步程式設計進行封裝 (推薦使用)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)
])
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...