[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/