程序、執行緒、協程(協程篇)
阿新 • • 發佈:2018-12-27
什麼是協程?
- 首先,先說一個前提:子程式/函式:在所有語言中都是層級呼叫的,比如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)