協程:將函數編寫爲一個能處理輸入參數的任務
使用yield語句並以表達式yield的形式創建協程
#匹配器案例:
def print_info(data): print('Looking for',data); while True: line = (yield) if data in line: print(line);
上面這個函數 就是一個協程程序 要使用這個函數 首先需用調用它 並且 向前執行到第一條yield語句
info = print_info('python'); info.__next__(); #向前執行第一條yield語句
輸出結果:
Looking for python
然後使用send方法發送數據給協同程序進行處理
info.send('Hell world'); info.send('this is python'); info.send('python goods');
如果 發送的數據中含有data參數值 則匹配成功 返回該條數據
輸出結果:
Looking for python
this is python
python goods
send()爲協程發送值時 程序處於暫時中止狀態 當發送值後 yield表達式將返回這個值,後面的程序對返回值進行處理 直到遇到下一個表達式 結束 這個過程將持續運行直到協程函數返回或者調用close方法
基於一部分程序生成的數據會被程序的另一部分使用(生產者-使用者模式)
編寫併發程序時,協程作用很明顯 他代表數據的一個使用者
info =[ print_info('python'), print_info('hello'), print_info('chunrui') ]
通過調用__next__()準備所有的匹配器
for n in info: n.__next__();
定義一個函數獲取文件中每列數據並且傳遞給生成器
def tail(f): for line in f : if not line: time.sleep(0.1); continue; #如果不存在 則推遲0.1s 進行下一次 yield line; myList = tail(open('E:/work.txt'))
循環myList中的值 然後send給協程程序
for m in myList: for n in info: n.send(m);
輸出結果:
Looking for python
Looking for hello
Looking for chunrui
python is conputer language
chunrui is name
hello world is the first case
I like to use python
my name is chunrui
總結:
1,協程:協同程序 能處理輸入的參數的任務函數 當協程暫停時 我們從其中獲取到返回值 當調用回到程序中時 能夠傳入額外或者新的參數 仍然能夠從上次離開的地方繼續
2,使用send函數爲協程發送參數