學習理解迭代器和生成器之後,開始使用協程來實現多工
當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。
我們可以使用next()或send()函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,執行yield之後的**。
# 定義兩個任務函式
deffunc1()
:while
true
:print
('第乙個函式'
)yield
deffunc2()
:while
true
:print
('第二個函式'
)yield
# 建立生成器物件
f1 = func1(
)f2 = func2(
)# 多工的實現
while
true
:next
(f1)
next
(f2)
上述**的執行過程為:建立生成器物件後,進入到while迴圈中,首先啟動的是f1,當遇到yield時,程式暫停,然後啟動f2,當遇到yield時,程式暫停,新的迴圈開始,又開始喚醒f1,如此實現了併發多工。
併發:交替執行任務的模式稱為併發理解yield實現多工的流程後,在嘗試使用greenlet實現多工。greenlet:為了簡單的實現多工而封裝的乙個模組並行:同時執行多個任務的模式稱為並行,是真正意義上的多工
特點:呼叫switch()方法時切換任務
from greenlet import greenlet
deffunc1()
:while
true
:print
('第乙個函式'
) g2.switch(
)# 切換到g2執行
deffunc2()
:while
true
:print
('第二個函式'
) g1.switch(
)# 切換到g1執行
g1 = greenlet(func1)
g2 = greenlet(func2)
# 使用物件名.switch()實現任務的切換執行
g1.switch(
)
gevent:為解決greenlet中需要人工切換任務的缺點而在此封裝的模組,實現了多工的自動切換
特點:- 當遇到延遲或堵塞等情況時,就自動切換任務
- 所有的延時或堵塞,都要使用gevent自己封裝的方法,或者在開始加上 monkey.patch_all(),系統會將耗時**替換為gevent的模組,不需要我們在手動修改其他多出**。
import gevent
from gevent import monkey # 將所有的耗時**,替換為gevent自己的模組
import time
monkey.patch_all(
)def
func1
(num)
:for i in
range
(num)
:# 輸出當前greenlet物件和i
print
(gevent.getcurrent(
), i)
# 使用gevent.sleep()
gevent.sleep(
0.5)
deffunc2
(num)
:for i in
range
(num)
:print
(gevent.getcurrent(
), i)
time.sleep(
0.5)
# 使用spawn()函式建立乙個greenlet物件
g1 = gevent.spawn(func1,3)
g2 = gevent.spawn(func2,3)
# 進入等待
g1.join(
)g2.join(
)
在建立物件和進入等待時,常用簡單的寫法:
# 簡單寫法
gevent.joinall(
[ gevent.spawn(func1,3)
, gevent.spawn(func2,3)
,])
Python 多工 協程
高階程式設計技巧 學習筆記 1.1 同步 非同步 1.2 阻塞 非阻塞 2.1 什麼是協程?協程,又稱微執行緒。協程是 python 個中另外一種實現多工的方式,只不過比執行緒更小占用更小執行單元 理解為需要的資源 2.2 python中的協程大概經歷了如下三個階段 最初的生成器變形yield se...
python多工實現方法之協程
多工的實現方式,使用下面方法中的乙個或者若干個進行組合 1 多程序 2 多執行緒 3 協程 三種方式的實現和資源占用各有不同,其中資源占用和實現所需的系統開銷 記憶體 cpu等 逐漸減少,實現難度依次降低。可以簡單的認為 乙個程序可以包含多個執行緒,乙個執行緒包含多個協程。多工實現方式的選擇 cpu...
多工 協程
示例 import time defwork1 while true print 正在掃地 yield defwork2 while true print 正在搬磚 yield w1 work1 w2 work2 協程肯定是併發執行 while true next w1 next w2 greenl...