一 併發的本質
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類的返回值。
importgevent
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 isrunning
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...