1. 程式人生 > >【python 協程】10分鐘瞭解下協程

【python 協程】10分鐘瞭解下協程

協程

  • 協程,又稱微執行緒,纖程。英文名Coroutine。
  • 子程式,或者稱為函式,在所有語言中都是層級呼叫,比如A呼叫B,B在執行過程中又呼叫了C,C執行完畢返回,B執行完畢返回,最後是A執行完畢。所以子程式呼叫是通過棧實現的,一個執行緒就是執行一個子程式。
  • 子程式呼叫總是一個入口,一次返回,呼叫順序是明確的。而協程的呼叫和子程式不同。
  • 協程看上去也是子程式,但執行過程中,在子程式內部可中斷,然後轉而執行別的子程式,在適當的時候再返回來接著執行。
  • 注意,在一個子程式中中斷,去執行其他子程式,不是函式呼叫,有點類似CPU的中斷。比如子程式A、B:
def A():
    print('1'
) print('2') print('3') def B(): print('x') print('y') print('z')

假設由協程執行,在執行A的過程中,可以隨時中斷,去執行B,B也可能在執行過程中中斷再去執行A,結果可能是:

1
2
x
y
3
z
  • 但是在A中是沒有呼叫B的,所以協程的呼叫比函式呼叫理解起來要難一些。
  • 看起來A、B的執行有點像多執行緒,但協程的特點在於是一個執行緒執行,那和多執行緒比,協程有何優勢?

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

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

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

Python對協程的支援是通過generator實現的。

在generator中,我們不但可以通過for迴圈來迭代,還可以不斷呼叫next()函式獲取由yield語句返回的下一個值。

但是Python的yield不但可以返回一個值,它還可以接收呼叫者發出的引數。
來看例子:

傳統的生產者-消費者模型是一個執行緒寫訊息,一個執行緒取訊息,通過鎖機制控制佇列和等待,但一不小心就可能死鎖。

如果改用協程,生產者生產訊息後,直接通過yield跳轉到消費者開始執行,待消費者執行完畢後,切換回生產者繼續生產,效率極高:

# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import time
time1=time.time()


def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    c.send(None)
    n = 0
    while n < 100:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
    c.close()


if __name__ == '__main__':

    c = consumer()
    produce(c)
    time2=time.time()
    print u'ok,計算結束!'
    print u'總共耗時:'+str(time2-time1)+'s'

執行結果:

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 6...
[CONSUMER] Consuming 6...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 7...
[CONSUMER] Consuming 7...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 8...
[CONSUMER] Consuming 8...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 9...
[CONSUMER] Consuming 9...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 10...
[CONSUMER] Consuming 10...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 11...
[CONSUMER] Consuming 11...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 12...
[CONSUMER] Consuming 12...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 13...
[CONSUMER] Consuming 13...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 14...
[CONSUMER] Consuming 14...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 15...
[CONSUMER] Consuming 15...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 16...
[CONSUMER] Consuming 16...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 17...
[CONSUMER] Consuming 17...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 18...
[CONSUMER] Consuming 18...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 19...
[CONSUMER] Consuming 19...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 20...
[CONSUMER] Consuming 20...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 21...
[CONSUMER] Consuming 21...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 22...
[CONSUMER] Consuming 22...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 23...
[CONSUMER] Consuming 23...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 24...
[CONSUMER] Consuming 24...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 25...
[CONSUMER] Consuming 25...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 26...
[CONSUMER] Consuming 26...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 27...
[CONSUMER] Consuming 27...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 28...
[CONSUMER] Consuming 28...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 29...
[CONSUMER] Consuming 29...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 30...
[CONSUMER] Consuming 30...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 31...
[CONSUMER] Consuming 31...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 32...
[CONSUMER] Consuming 32...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 33...
[CONSUMER] Consuming 33...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 34...
[CONSUMER] Consuming 34...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 35...
[CONSUMER] Consuming 35...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 36...
[CONSUMER] Consuming 36...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 37...
[CONSUMER] Consuming 37...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 38...
[CONSUMER] Consuming 38...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 39...
[CONSUMER] Consuming 39...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 40...
[CONSUMER] Consuming 40...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 41...
[CONSUMER] Consuming 41...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 42...
[CONSUMER] Consuming 42...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 43...
[CONSUMER] Consuming 43...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 44...
[CONSUMER] Consuming 44...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 45...
[CONSUMER] Consuming 45...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 46...
[CONSUMER] Consuming 46...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 47...
[CONSUMER] Consuming 47...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 48...
[CONSUMER] Consuming 48...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 49...
[CONSUMER] Consuming 49...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 50...
[CONSUMER] Consuming 50...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 51...
[CONSUMER] Consuming 51...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 52...
[CONSUMER] Consuming 52...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 53...
[CONSUMER] Consuming 53...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 54...
[CONSUMER] Consuming 54...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 55...
[CONSUMER] Consuming 55...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 56...
[CONSUMER] Consuming 56...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 57...
[CONSUMER] Consuming 57...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 58...
[CONSUMER] Consuming 58...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 59...
[CONSUMER] Consuming 59...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 60...
[CONSUMER] Consuming 60...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 61...
[CONSUMER] Consuming 61...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 62...
[CONSUMER] Consuming 62...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 63...
[CONSUMER] Consuming 63...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 64...
[CONSUMER] Consuming 64...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 65...
[CONSUMER] Consuming 65...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 66...
[CONSUMER] Consuming 66...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 67...
[CONSUMER] Consuming 67...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 68...
[CONSUMER] Consuming 68...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 69...
[CONSUMER] Consuming 69...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 70...
[CONSUMER] Consuming 70...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 71...
[CONSUMER] Consuming 71...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 72...
[CONSUMER] Consuming 72...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 73...
[CONSUMER] Consuming 73...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 74...
[CONSUMER] Consuming 74...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 75...
[CONSUMER] Consuming 75...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 76...
[CONSUMER] Consuming 76...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 77...
[CONSUMER] Consuming 77...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 78...
[CONSUMER] Consuming 78...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 79...
[CONSUMER] Consuming 79...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 80...
[CONSUMER] Consuming 80...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 81...
[CONSUMER] Consuming 81...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 82...
[CONSUMER] Consuming 82...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 83...
[CONSUMER] Consuming 83...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 84...
[CONSUMER] Consuming 84...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 85...
[CONSUMER] Consuming 85...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 86...
[CONSUMER] Consuming 86...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 87...
[CONSUMER] Consuming 87...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 88...
[CONSUMER] Consuming 88...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 89...
[CONSUMER] Consuming 89...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 90...
[CONSUMER] Consuming 90...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 91...
[CONSUMER] Consuming 91...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 92...
[CONSUMER] Consuming 92...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 93...
[CONSUMER] Consuming 93...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 94...
[CONSUMER] Consuming 94...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 95...
[CONSUMER] Consuming 95...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 96...
[CONSUMER] Consuming 96...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 97...
[CONSUMER] Consuming 97...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 98...
[CONSUMER] Consuming 98...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 99...
[CONSUMER] Consuming 99...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 100...
[CONSUMER] Consuming 100...
[PRODUCER] Consumer return: 200 OK
ok,計算結束!
總共耗時:0.0120000839233s

Process finished with exit code 0