背景
最近在做音频文件的asr识别率测试,数据非常的庞大,大概有45万条数据(数据是存储到excel文件中)。需要在3天的之类测试完成,调用的接口最大支持20个并发。
最原始的脚本是按顺序执行
1、读取excel
2、请求接口返回响应信息
3、解析响应信息并将结果写入到excel中
4、计算识别率
为了解决在3天内类执行完所有的案例,采用的办法如下
1、将总的excel文件拆分成20个excel文件。
2、复制20多个脚本文件,并修改excel文件路径.
3、执行20个脚本文件
虽然能执行完成,但是有一定的缺点。
1、不够灵活,维护难,修改一处脚本,所有的脚本都需要修改
2、执行完成后,需要对所有的excel文件进行合并和汇总。
拆分多个excel,多个脚本去执行,实际上也就是了进行的是多进程的操作,而python脚本实际是支持多进程操作的。
优化脚本
将单线程修改为多进程
from multiprocessing import Process
import openpyxl
def write_excel(process_id):
filename = str(process_id) +".xlsx"
mywb = openpyxl.Workbook()
new_sheet = mywb.create_sheet(index=0, title=str(process_id))
row1 = ["Recognition success rate"]
row2 = ["wav", "expect", "asr", "recognition result"]
new_sheet.append(row1)
new_sheet.append(row2)
for i in range(0,5):
row = [str(i)]
new_sheet.append(row)
mywb.save("E:/新建文件夹/"+filename)
if __name__=="__main__":
processsList=[]
for i in range(2):
p= Process(target=write_excel,args=(i,))
processsList.append(p)
for i in processsList:
i.start()
for i in processsList:
i.join()
这种方式,会生成多个excel文件,因为每个进程都是独立了,如何只生成一个excel呢?也就是将上面线程的信息都写入到一个excel里面。
方法1:先读取再写入。
#excel文件路径
filename="E:/新建文件夹/total.xlsx"
def write_excel(process_id,l):
l.acquire()
if os.path.exists(filename):
mywb=openpyxl.load_workbook(filename)
if process_id==0:
num=15
else:
num=5
new_sheet = mywb.create_sheet(index=process_id, title=str(process_id))
row1 = ["Recognition success rate"]
row2 = ["wav", "expect", "asr", "recognition result"]
new_sheet.append(row1)
new_sheet.append(row2)
for i in range(0,num):
row = [str(i)]
print(str(i))
new_sheet.append(row)
mywb.save(filename)
mywb.close()
l.release()
if __name__=="__main__":
if os.path.exists(filename):
os.remove(filename)
mywb = openpyxl.Workbook()
mywb.save(filename)
mywb.close()
lock = Lock()
processsList=[]
for i in range(2):
p= Process(target=write_excel,args=(i,lock))
processsList.append(p)
for i in processsList:
i.start()
for i in processsList:
i.join()
待续
微信号:fangfang922125