[Python]装饰器与进程

386 Views

1.装饰器

如果多个函数都需要执行相同或类似的操作,比如想要知道当前运行的函数名,该函数的运行时间等,装饰器是个很好的办法。

#装饰器,为每个函数增加打印函数名和显示运行时间的功能
def prt_log(func):
    def wrapper(*args, **kwargs):
        print("Run Function:[%s]... " % func.__name__)
        e1=time.time()
        ret=func(*args, **kwargs)
        e2=time.time()
        print("RunTime: %f" % float(e2-e1))
        return ret
    return wrapper

调用时只要在函数定义前追加一行

@prt_log

测试:

@prt_log
def a():
    print ("B")

if __name__=="__main__":
    a()

2.多进程

因为python的全局锁(GIL)作用,多线程似乎并不能起到很好的效果,但是对于多核CPU,多进程还是能有加速运行的作用
尝试对两个txt文件执行多进程读写操作。src.txt是一个有50行,分别是从1~50数字的文本。des是空的目标文本。
创建10个进程,每个进程读取src.txt的5行数字,对每个数字*2后写入des.txt,而且要顺序保持不变。

#coding=utf-8
from multiprocessing import Pool
import time
import Conf

def writeFile(x):
    with open('des.txt','a+') as f:
        for i in x:
            f.write(str(int(i)*2)+"\n")

def readFile():
    a=[]
    with open('src.txt',encoding="UTF-8") as f:
        for line in f:
            a.append(line)
    return a

def readStr(L,id,num):
    print(id,"->",end=' ')
    length=len(L)
    each_len=int(length/num+1)
    start=id*each_len
    end=(id+1)*each_len

    if end>=length:
        return L[start:]
    else:
        return L[start:end]

if __name__=="__main__":
    L=readFile()

    pool=Pool()
    Max_Pro_Num=10

    for id in range(Max_Pro_Num):
        pool.apply_async(readStr,(L,id,Max_Pro_Num,),callback=writeFile)

    pool.close()
    pool.join()
    print("end")

虽然进程相互合作完成乘法操作,但是因为执行顺序和完成时间等原因,每次运行的顺序不一定是正序的

最后,装饰器似乎不能用在进程上,参考
http://ralph-wang.github.io/blog/2015/02/15/zhuang-shi-qi-yu-duo-jin-cheng-yi-ji-pickle/

留下回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据