初步了解協程
def如果有多個多個協程函式都需要初始化的話,我們用裝飾器eater():
print('
start to eat')
while
true:
food=yield
print('
is eating food:%s
'%food)
defproducer():
dog=eater()
next(dog)
#先next一次喚醒協程函式
#然後下面的操作都是dog.send(值)
food1='
北京烤鴨
'food2='
魚香肉絲
'dog.send(food1)
dog.send(food2)
producer()
輸出結果:
start to eat
iseating food:北京烤鴨
is eating food:魚香肉絲
def如果我們在寫專案的時候,並且有多個協程函式,我們需要寫注釋,該怎麼寫:init(func):
def warpper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return
g
return
warpper
@init
#eater=init(eater) #eater=warpper
defeater():
print('
start to eat')
while
true:
food=yield
print('
is eating food:%s
' %food)
e=eater()#
e=warpper()
e.send('
北京烤鴨')
輸出結果:
start to eat
is eating food:北京烤鴨
錯誤示例:
defview codeinit(func):
def warpper(*args,**kwargs):
'我是warpper函式
'g=func(*args,**kwargs)
next(g)
return
g
return
warpper
@init
#eater=init(eater) #eater=warpper
defeater():
'我是eater函式
'print('
start to eat')
while
true:
food=yield
print('
is eating food:%s
' %food)
(help(eater))
輸出結果:
help on function warpper
in module __main__
:warpper(*args, **kwargs)
我是warpper函式
none
我們看的是eater函式的幫助資訊,返回的卻是warpper函式資訊的幫助
正確示例:
importview codefunctools
definit(func):
@functools.wraps(func)
#讓warpper的幫助資訊同eater相同
def warpper(*args,**kwargs):
'我是warpper函式
'g=func(*args,**kwargs)
next(g)
return
g
return
warpper
@init
#eater=init(eater) #eater=warpper
defeater():
'我是eater函式
'print('
start to eat')
while
true:
food=yield
print('
is eating food:%s
' %food)
(help(eater))
輸出結果:
help on function eater
in module __main__
:eater()
我是eater函式
none
#實現grep -rl 'python' /root/
importosimport
functools
definit(func):
@functools.wraps(func)
#讓warpper的幫助資訊同eater相同
def warpper(*args,**kwargs):
'我是warpper函式
'g=func(*args,**kwargs)
next(g)
return
g
return
warpper
#面向過程的程式設計
#擴充套件性差
defget_file(abs_path,target):
'''生產乙個個檔案
:param abs_path:傳進來的決對路徑
:param target: 下乙個目標
:return: 返回絕對檔案的路徑
'''g=os.walk(abs_path)
for top_dir,current_dir,files in
g:
for file in
files:
abs_file_path=r'
%s\%s
' %(top_dir,file)
target.send(abs_file_path)
@init
defopener(target):
'''開啟檔案
:return: 返回控制代碼
:param target 下乙個目標
'''while
true:
abs_file_path=yield
with open(abs_file_path) as f:
target.send((f,abs_file_path))
@init
defget_lines(target):
'''讀取每一行的內容
:param target: 下乙個目標
:return:返回每一行的內容
'''while
true:
f,abs_file_path=yield
for line in
f: target.send((line,abs_file_path))
@init
defgrep(pattern,target):
'''過濾關鍵字
:param pattern:匹配關鍵字
:param target: 下乙個目標
:return: 返回檔案
'''while
true:
line,abs_file_path=yield
if pattern in
line:
target.send(abs_file_path)
@init
defprinter():
'''列印功能
:return:輸出資訊
'''while
true:
abs_file_path=yield
(abs_file_path)
get_file(r
'd:\test
',opener(get_lines(grep('
zzl',printer()))))
Python之協程函式
python之協程函式 什麼是協程函式 如果乙個函式內部yield的使用方法是表示式形式的話,如x yield,那麼該函式成為協程函式。def eater name print s start to eat food name food list while true food yield food...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...
python協程函式
例項 def menu x print welcome s to shaxian restaurant x men list while true print men list food yield men list print s start to eat s x,food g menu 張三 n...