協程:將函數寫成一個能處理輸入參數的任務
使用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函數為協程傳送參數
以上就是python中的協程(協同程序)的內容,更多相關內容請關注PHP中文網(www.php.cn)!