1. 程式人生 > >程序、執行緒、協程(協程篇)

程序、執行緒、協程(協程篇)

什麼是協程?

  • 首先,先說一個前提:子程式/函式:在所有語言中都是層級呼叫的,比如A呼叫B。在B執行過程中又可以呼叫C,C執行完畢返回,B執行完畢返回,最後是A執行完畢返回。是通過棧實現的,一個執行緒就是執行一個子程式,子程式呼叫總是一個入口,一次返回,呼叫的順序是明確的。

然後就是協程的概念:

  • 看上去也是子程式,但執行過程中,在子程式的內部可終端,然後轉而執行別的子程式,不是函式呼叫
# 協程
def C():
    print('C--start')
    print('C--end')
def B():
    print('B--start'
) C() print('B--end') def A(): print('A--start') B() print('A--end') A() # 協程的特點就是一個只有一個執行緒在執行,協程的執行效率極高 # 因為只有一個執行緒,也不存在同時寫變數的衝突,在協程中共享資源不加鎖,只需要判斷狀態
# 協程原理
# python 對協程的支援是通過generator實現的
def run():
    print(1)
    yield 10
    print(2)
    yield 20
    print(3)
    yield 30
# 協程的最簡單風格,控制函式的階段執行,節約協程或者程序的切換
# 返回只是一個生成器 m = run() print(next(m)) print(next(m)) print(next(m))
# 資料傳輸
def run():
    # 空變數,儲存的作用data始終為空
    data = ''   # 第一次執行的
    r = yield data   # 出去r=,後面也是第一次執行的;第一次執行,傳遞進來個空值,返回為空
    # r = a
    print(1, r, data) # 第二次傳遞進來的a
    r = yield data     # 第二次返回一個空
    # r = b
    print(2,
r, data) r = yield data # r = c print(3, r, data) r = yield data m = run() print(m.send(None)) print(m.send('a')) print(m.send('b')) print(m.send('c'))
# 生產者與消費者
def product(a):
    a.send(None)
    for i in range(5):
        print('生產者與消費者')
        r = a.send(str(i))
        print('消費者消費了資料{}'.format(r))
    a.close()
def customer():
    data = ''
    while True::
        n = yield data
        if not n:
            return
        print('消費者消費了{}'format(n))
        data = '200'
c = customer()
product(c)