學習協程的部分知識

2021-08-25 05:35:23 字數 2272 閱讀 7634

一.概念

協程,又稱微執行緒,纖程,英文名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...