單線程實現併發——協程,gevent模塊

一 併發的本質  網絡

  1 切換多線程

  2 保存狀態併發

二 協程的概念函數

  協程,又稱微線程,纖程。英文名Coroutine。單線程下實現併發,用戶從應用程序級別控制單線程下任務的切換,注意必定是遇到I/O才切。性能

  協程的特色在因而一個線程執行,那和多線程比,協程有何優點?spa

  最大的優點就是協程極高的執行效率。由於子程序切換不是線程切換,而是由程序自身控制,所以,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優點就越明顯。線程

  第二大優點就是不須要多線程的鎖機制,由於只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只須要判斷狀態就行了,因此執行效率比多線程高不少。code

  由於協程是一個線程執行,那怎麼利用多核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
def foo():
    print('%s is running ' % current_thread().getName())
    time.sleep(1)
    print('%s is done '%current_thread().getName())
def bar():
    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 <Greenlet at 0x26d7aff0898: bar>
DummyThread-1 is running 
DummyThread-2 is running 
DummyThread-1 is done 
DummyThread-2 is done 
相關文章
相關標籤/搜索