• python(18)- 协程函数及应用


    协程

    def init(func):
        def wrapper(*args,**kwargs):
            obj = func(*args,**kwargs)
            next(obj)
            return obj
        return wrapper
    
    
    @init
    def food(name):
        print("%s start to eat" % name)
        food_list = []
        while True:
            food = yield food_list
            food_list.append(food)
            print("%s eat %s" % (name,food_list))
    
    
    e = food("xyp")     # xyp start to eat
    e.send("apple")     # xyp eat ['apple']
    e.send("apple")     # xyp eat ['apple', 'apple']
    e.send("apple")     # xyp eat ['apple', 'apple', 'apple']
    ......
    协程 吃包子
     1 #grep -rl 'python' C:egon
     2 import os,time
     3 def init(func):
     4     def wrapper(*args,**kwargs):
     5         res=func(*args,**kwargs)
     6         next(res)
     7         return res
     8     return wrapper
     9 
    10 #找到一个绝对路径,往下一个阶段发一个
    11 @init
    12 def search(target):
    13     '找到文件的绝对路径'
    14     while True:
    15         dir_name=yield #dir_name='C:\egon'
    16         print('车间search开始生产产品:文件的绝对路径')
    17         time.sleep(2)
    18         g = os.walk(dir_name)
    19         for i in g:
    20             # print(i)
    21             for j in i[-1]:
    22                 file_path = '%s\%s' % (i[0], j)
    23                 target.send(file_path)
    24 
    25 @init
    26 def opener(target):
    27     '打开文件,获取文件句柄'
    28     while True:
    29         file_path=yield
    30         print('车间opener开始生产产品:文件句柄')
    31         time.sleep(2)
    32         with open(file_path) as f:
    33             target.send((file_path,f))
    34 
    35 @init
    36 def cat(target):
    37     '读取文件内容'
    38     while True:
    39         file_path,f=yield
    40         print('车间cat开始生产产品:文件的一行内容')
    41         time.sleep(2)
    42         for line in f:
    43             target.send((file_path,line))
    44 
    45 @init
    46 def grep(pattern,target):
    47     '过滤一行内容中有无python'
    48     while True:
    49         file_path,line=yield
    50         print('车间grep开始生产产品:包含python这一行内容的文件路径')
    51         time.sleep(0.2)
    52         if pattern in line:
    53             target.send(file_path)
    54 
    55 @init
    56 def printer():
    57     '打印文件路径'
    58     while True:
    59         file_path=yield
    60         print('车间printer开始生产产品:得到最终的产品')
    61         time.sleep(2)
    62         print(file_path)
    63 
    64 
    65 
    66 g=search(opener(cat(grep('python',printer()))))
    67 g.send('C:\egon')
    68 g.send('D:\dir1')
    69 g.send('E:\dir2')
    协程windows 查找文件
     1 import os
     2 
     3 def init(func):
     4     def wrapper(*args,**kwargs):
     5             obj = func(*args,**kwargs)
     6             next(obj)
     7             return obj
     8     return wrapper
     9 
    10 @init
    11 def search(target):
    12     while True:
    13         dir_name = yield
    14         obj = os.walk(dir_name)
    15         for file in obj:
    16             for path in file[-1]:
    17                 file_path = "%s/%s" % (file[0],path)
    18                 target.send(file_path)
    19 
    20 @init
    21 def opener(target):
    22     while True:
    23         file_path = yield
    24         with open(file_path) as f:
    25             target.send((file_path,f))
    26 @init
    27 def cat(target):
    28     while True:
    29         file_path,file = yield
    30         for line in file:
    31             target.send((file_path,line))
    32 @init
    33 def grep(pattern,target):
    34     while True:
    35         file_path,line = yield
    36         if pattern in line:
    37             target.send(file_path)
    38 @init
    39 def print_file():
    40     while True:
    41         file_path = yield
    42         print(file_path)
    43 
    44 
    45 g = search(opener(cat(grep("a",print_file()))))
    46 g.send("/Users/centos/Desktop/example")
    协程Linux查找文件

    模拟grep -rl “python” F:xuyaping这个命令

    #查看xuyaping文件夹所有的绝对路径
    import os
    g=os.walk("F:\xuyaping")  #g为迭代器
    for i in g:
        # print(i)   #i为文件路径
        for j in i[-1]:
            file_path="%s\%s" %(i[0],j)
            print(file_path)
    
    
    

    程序输出结果:

    F:xuyapingxuyaping.txt.txt
    F:xuyapingxuyaping1.txt.txt
    F:xuyapingaa.txt.txt
    F:xuyapingaa1a1.txt.txt
    F:xuyapingaa1a2a2.txt.txt
    F:xuyaping.txt.txt
    

     代码如下:

    #模拟grep -rl “python” F:xuyaping这个命令
    
    import os,time
    #初始化被装饰的函数,使其运行到yield所在的行
    def init(func):
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
            next(res)
            return res
        return wrapper
    
    #search函数用循环找到一个绝对路径,往下一个阶段opener函数传递一次,直至传递完。
    # 所以opener函数循环的收,所以opener函数用while循环。
    @init
    def search(target):   #定义生成器target,用于传递路径file_path
        "找到文件的绝对路径"
        while True:
            dir_name=yield
            print("车间search开始生产产品:文件的绝对路径")
            time.sleep(1)
            g = os.walk(dir_name)
            for i in g:
                for j in i[-1]:
                    file_path="%s\%s" %(i[0],j)
                    target.send(file_path)   #传递路径file_path,给opener函数
    
    @init
    def opener(target):
        "打开文件,获取文件句柄"
        while True:
            file_path=yield  #opener函数接收search函数传递过来的路径file_path。opener函数将执行结果传递给search函数中的target
            print("车间opener开始生产产品:文件句柄")
            time.sleep(1)
            with open(file_path) as f:
                target.send((file_path,f))    #同样传递句柄f 和file_path给cat函数,所以此时用生成器target来传递,同上
    @init
    def cat(target):
        "读取文件内容"
        while True:
            file_path,f=yield   #cat函数接收opener函数传递过来的句柄f 和file_path。cat函数将执行结果传递给opener函数中的target
            print("车间cat开始生产产品:文件的一行内容")
            time.sleep(1)
            for line in f:
                target.send((file_path,line))
    
    @init
    def grep(pattern,target):
        "过滤一行内容中有无python"
        while True:
            file_path,line=yield
            print("车间grep开始生产产品:包含python这一行内容的文件路径")
            time.sleep(1)
            if pattern in line:
                target.send(file_path)
    
    @init
    def printer():
        "打印文件路径"
        while True:
            file_path=yield
            print("车间printer开始生产产品:得到最终的产品")
            time.sleep(1)
            print(file_path)
    
    #g=search("target")--->g=search(opener(target))--->g=search(opener(cat(target)))
    # --->g=search(opener(cat(grep(patteren,target))))--->g=search(opener(cat(grep("python",printer()))))
    g=search(opener(cat(grep("python",printer()))))
    g.send("F:\xuyaping")
    

    运行结果:

    车间search开始生产产品:文件的绝对路径
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间printer开始生产产品:得到最终的产品
    F:xuyapingxuyaping.txt.txt
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间printer开始生产产品:得到最终的产品
    F:xuyapingxuyaping1.txt.txt
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间printer开始生产产品:得到最终的产品
    F:xuyapingaa1a1.txt.txt
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间opener开始生产产品:文件句柄
    车间cat开始生产产品:文件的一行内容
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间printer开始生产产品:得到最终的产品
    F:xuyaping.txt.txt
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    车间grep开始生产产品:包含python这一行内容的文件路径
    
     
  • 相关阅读:
    pyqt信号和槽传递额外参数
    PyQt--QTreeWidget
    转载:futex同步机制详解
    Linux 下的同步机制
    Linux 下线程的理解
    Linux下的物理内存管理2-slab缓存的管理
    转:C语言的编译链接过程的介绍
    LInux中ThreadInfo中的preempt_count字段
    LInux中的物理内存管理
    Linux下的内核抢占
  • 原文地址:https://www.cnblogs.com/xuyaping/p/6701094.html
Copyright © 2020-2023  润新知