協程,是充分利用cpu給該執行緒的時間,在乙個執行緒裡放置多個任務,當某個任務阻塞時就執行下乙個任務。其特點是能夠記住這些任務執行到哪一步了,下次再執行該任務的時候回從上次阻塞的地方繼續開始。建立協程需要使用gevent模組。**如下:
import gevent
'''gevent協程中,遇到需要耗費時間的操作就會跳轉到下乙個任務。
但是此處的延時、堵塞或者其他耗時的操作,都必須換到gevent模組下的'''。
deff
(n):
for i in
range
(n):
print
(gevent.getcurrent(
), i)
# getcurrent()函式會獲取到當前的協程號
gevent.sleep(
0.5)
# 如果沒有使用monkey,則需要這樣寫才能呼叫時間模組。
# 建立3個任務物件
g1 = gevent.spawn(f,5)
# 第乙個引數指定這個任務到那裡去執行,第二個引數傳入需要值。
g2 = gevent.spawn(f,5)
g3 = gevent.spawn(f,5)
g1.join(
)# join()方法會造成主線程堵塞,必須等該任務完全結束後才能接堵塞。
g1.join(
)g1.join(
)
d:\super\anaconda\python.exe d:/super/python_file/study/8.網路程式設計/9-協程gevent.py00
0111
2223
3344
4000
1112
2233
3444
值得注意的是,在協程中,所有的耗時操作,都必須換成gevent模組下的。或者呼叫gevent中的monkey,這樣就可以正常使用以前的模組了。
from gevent import monkey
import gevent
import time
'''gevent協程中,遇到需要耗費時間的操作就會跳轉到下乙個任務。
但是此處的延時、堵塞或者其他耗時的操作,都必須換到gevent模組下的'''
monkey.patch_all(
)# 將程式中用到的耗時的操作的**,換為gevent中自己實現的模組。
deff
(n):
for i in
range
(n):
print
(gevent.getcurrent(
), i)
# getcurrent()函式會獲取到當前的協程號
#gevent.sleep(0.5) # 如果沒有使用monkey,則需要這樣寫才能呼叫時間模組。
time.sleep(
0.5)
# 因為使用了monkey,所以此處可以正常使用時間模組。其他耗時操作也是如此。
# 建立3個任務物件
g1 = gevent.spawn(f,5)
# 第乙個引數指定這個任務到那裡去執行,第二個引數傳入需要值。
g2 = gevent.spawn(f,5)
g3 = gevent.spawn(f,5)
g1.join(
)# join()方法會造成主線程堵塞,必須等該任務完全結束後才能接堵塞。
g1.join(
)g1.join(
)# 下面這行**,將建立的任務放到乙個列表中去,在放到joinall()這個方法中,它將在所有任務都結束後才能解堵塞。
gevent.joinall(
[gevent.spawn(f,5)
,gevent.spawn(f,5)
,gevent.spawn(f,5)
])
這裡呼叫monkey.patch_all(),則下面的sleep()可以正常使用time模組下的。 Python之協程技術
1.定義 纖程,微執行緒。是允許在不同入口點不同位置暫停或開始的電腦程式,簡單來說,協程就是可以暫停執行的函式。2.協程原理 記錄乙個函式的上下文,協程排程切換時會將記錄的上下文儲存,在切換回來時進行調取,恢復原有的執行內容,以便從上一次執行位置繼續執行。協程本質上就是乙個執行緒,以前多執行緒任務的...
Python 高階 之 協程
協程的概念級描述 與執行緒對比 知乎 鏈結 執行緒有兩個必須要處理的問題 一是碰著阻塞式i o會導致整個程序被掛起 二是由於缺乏時鐘阻塞,程序需要自己擁有排程執行緒的能力。如果一種實現使得每個執行緒需要自己通過呼叫某個方法,主動交出控制權。那麼我們就稱這種執行緒是協作式的,即是協程。在python中...
Python學習之協程
我們都知道執行緒間的任務切換是由作業系統來控制的,而協程的出現,就是為了減少作業系統的開銷,由協程來自己控制任務的切換 協程本質上就是執行緒。既然能夠切換任務,所以執行緒有兩個最基本的功能 一是儲存狀態 二是任務切換 8.8.1 協程的特點 優點 缺點 特點 8.8.2 greenlet 使用gre...