單執行緒實現併發 協程,gevent模組

2022-04-05 03:12:40 字數 1569 閱讀 1638

一 併發的本質  

1 切換

2 儲存狀態

二 協程的概念

協程,又稱微執行緒,纖程。英文名coroutine。單執行緒下實現併發,使用者從應用程式級別控制單執行緒下任務的切換,注意一定是遇到i/o才切。

協程的特點在於是乙個執行緒執行,那和多執行緒比,協程有何優勢?

最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。

第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多執行緒高很多。

因為協程是乙個執行緒執行,那怎麼利用多核cpu呢?最簡單的方法是多程序+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的效能。

三 gevent模組

gevent是乙個基於協程的python網路庫。

需要匯入猴子補丁。

方法:g1=gevent.spawn(func,):提交任務。   生成g1,是greenlet類

gevent.sleep():睡

gevent.joinall(可迭代物件):阻塞,知道所有選中的任務執行完畢。

g1.join() 

g1.value 獲取由func函式生成greenlet類的返回值。

import

gevent

from gevent import

monkey;monkey.patch_all()

from threading import

current_thread

import

time

deffoo():

print('

%s is running

' %current_thread().getname())

time.sleep(1)

print('

%s is done

'%current_thread().getname())

defbar():

print('

%s is running

' %current_thread().getname())

time.sleep(2)

print('

%s is done

' %current_thread().getname())

g1=gevent.spawn(foo)

g2=gevent.spawn(bar)

print('g1'

,g1)

print('g2'

,g2)

#g1.join()

#g2.join()

gevent.joinall([g1,g2])

輸出:

g2 dummythread-1 is

running

dummythread-2 is

running

dummythread-1 is

done

dummythread-2 is done

程序池和執行緒池 協程 TCP單執行緒實現併發

一 程序池和執行緒池 當被操作物件數目不大時,我們可以手動建立幾個程序和執行緒,十幾個幾十個還好,但是如果有上百個上千個。手動操作麻煩而且電腦硬體跟不上,可以會崩潰,此時程序池 執行緒池的功效就能發揮了。我們可以通過維護乙個程序池 執行緒池來控制程序數目和執行緒數目。在保證計算機硬體安全的情況下最大...

gevent實現協程

1 yield實現 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield def main t1 task 1 建立迭代器 t...

爬蟲 單執行緒 多工非同步協程

要點 1.resquests模組不支援非同步,在需要非同步的地方使用aiohttp模組進行替換 2.定義乙個協程函式,建立協程任務,將 協程 打包為乙個 task 排入日程準備執行。返回task物件 獲取當前事件迴圈,開啟迴圈 data await response.read 此處參考aiohttp...