進程、線程、協程(協程篇)
阿新 • • 發佈:2018-12-25
生成 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)
進程、線程、協程(協程篇)