1. 程式人生 > >進程、線程、協程(協程篇)

進程、線程、協程(協程篇)

生成 next 進程 true code 語言 one pytho 返回

什麽是協程?

  首先,先說一個前提:子程序/函數:在所有語言中都是層級調用的,比如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)

進程、線程、協程(協程篇)