一.概念
協程,又稱微執行緒,纖程,英文名coroutine。協程的作用,是在執行函式a時,可以隨時中斷,去執行函式b,然後中斷繼續執行函式a(可以自由切換)。但這一過程並不是函式呼叫(沒有呼叫語句),這一整個過程看似像多執行緒,然而協程只有乙個執行緒執行。
二.優勢
執行效率極高,因為子程式切換(函式)不是執行緒切換,由程式自身控制,沒有切換執行緒的開銷。所以與多執行緒相比,執行緒的數量越多,協程效能的優勢越明顯。
不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在控制共享資源時也不需要加鎖,因此執行效率高很多。
三.yield 特點
1、程式遇到yield會暫停,如果yield後面有值,返回結果之後再暫停
2、再次啟動生成器,**從yield之後開始執行
四.參考**
#生成器
defwork
(num):
a = 0
b = 1
current_index = 0
while current_index < num:
a,b = b,a+b
current_index += 1
yield a,b #程式遇到yield會暫停,如果yield後面有值,返回結果之後再暫停
assignment = work(5)
print(assignment)
print(next(assignment))
print(next(assignment))
print(next(assignment))
print(next(assignment))
print(next(assignment))
五.greenlet#需要手動切換其他協程工作
greenlet的安裝很簡單:pip install greenlet 即可
是乙個更加原始的微執行緒的概念,但是沒有排程,或者叫做協程。這在你需要控制你的**時很有用。你可以自己構造微執行緒的 排程器;也可以使用」greenlet」實現高階的控制流。例如可以重新建立構造器;不同於python的構造器,我們的構造器可以巢狀的呼叫函式,而被 巢狀的函式也可以 yield 乙個值。
六.參考**
from greenlet import greenlet
import time
defwork1
():for i in range(5):
print('work1',i)
time.sleep(0.1)
g2.switch()
# 手動切換其他協程工作
defwork2
():for i in range(5):
print('work2',i)
time.sleep(0.1)
g1.switch()#手動切換其他協程工作
# 建立協程
g1 = greenlet(work1)
g2 = greenlet(work2)
# 啟動協程
g1.switch()
g2.switch()
七.gevent:繼續python協程方面的介紹,這次要講的是gevent,它是乙個併發網路庫。它的協程是基於greenlet的,並基於libev實現快速事件迴圈(linux上是epoll,freebsd上是kqueue,mac os x上是select)。有了gevent,協程的使用將無比簡單,你根本無須像greenlet一樣顯式的切換,每當乙個協程阻塞時,程式將自動排程,gevent處理了所有的底層細節。
八.參考**
import gevent
import time
from gevent import monkey
monkey.patch_all()
# 給所有的耗時操作打上補丁,協程自動切換
defwork1
():for i in range(5):
print('work1',i)
time.sleep(0.1)
defwork2
():for i in range(5):
print('work2',i)
time.sleep(0.1)
g1 = gevent.spawn(work1)
g2 = gevent.spawn(work2)
# time.sleep(100)
g1.join()
g2.join()
# 等待協程操作完成`
C 面試知識 協程
跟程序和執行緒放在一起,只不過相比其他兩個更少的關注度。一種使用者態的輕量級執行緒,完全由使用者排程控制,擁有自己的暫存器上下文和棧,協程排程切換的時候,先將暫存器上下文和棧儲存到其他地方,切換回來的時候再恢復之前儲存的暫存器上下文和棧。直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數...
python學習 協程
在學習非同步io模型前,我們先來了解協程。協程,又稱微執行緒,纖程。英文名coroutine。協程的概念很早就提出來了,但直到最近幾年才在某些語言 如lua 中得到廣泛應用。子程式,或者稱為函式,在所有語言中都是層級呼叫,比如a呼叫b,b在執行過程中又呼叫了c,c執行完畢返回,b執行完畢返回,最後是...
Lua學習 協程
print 協同程式 print 協程的建立 常用方式 coroutine.create fun function print 123 end co coroutine.create fun 協程的本質是乙個執行緒物件 print co print type co coroutine.wrap co...