python中的協程(協同程序)

協程:將函數編寫爲一個能處理輸入參數的任務

使用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函數爲協程發送參數

                

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章