python中的協程(協同程序)

黄舟
發布: 2017-01-19 17:19:24
原創
1640 人瀏覽過

協程:將函數寫成一個能處理輸入參數的任務
使用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)!


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!