本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427
之前写过一篇 JMeter性能测试之参数加密【一】,现在把后面的补上。实际第一篇就写完了 JMeter压测遇到加密接口的处理方式,此篇内容全部为扩展。
【实际这篇博客推迟发布N个月】
个人博客:https://blog.csdn.net/zyooooxie
【以下所有内容仅为个人项目经历,如有不同,纯属正常】
数据准备: mobile.txt 是10w条数据,dept_code.txt的数据量是 5w。
我想在加密时 将2个参数 混合(笛卡尔乘积) ,要得到 一份最少200w条数据的txt文件。
为了生成这样一份param.txt,我做了一些尝试;这一期 主要来讲 多线程 + for循环。
首先要知道: (每加密一次+将结果写入文件) 、 (得出全部加密结果+统一将结果写入文件) 2种方式中,在相同结果长度时,第二种 执行效率更高。
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
"""
# (全局变量)线程锁:gl_Lock;队列:q_phone(mobile.txt)、q_dc(dept_code.txt);最终结果列表:gl_res_list;
gl_res_list = list()
gl_Lock = threading.Lock()
q_phone = queue.Queue()
q_dc = queue.Queue()
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
"""
def write_txt(data: Union[str, list]):
"""
将加密结果 写入文件(可一条一条写入,也可一次性全部写入)
:param data:单独一条记录str or 全部记录list
:return:
"""
file = r'D:\program\param_{}.txt'.format(random.randint(1, 99999))
ls = os.linesep
with open(file, mode='a', encoding='utf-8') as f:
if isinstance(data, str):
# f.write(''.join([data, ls]))
f.write(''.join([data, '\n']))
elif isinstance(data, list):
Log.info(len(data))
data = [''.join([d, '\n']) if type(d) == str else ''.join([','.join([*d]), '\n']) for d in data]
f.writelines(data)
def put_queue(file_path: str, queue_obj: queue.Queue):
"""
将txt文件内容放置于队列
:param file_path: 文件路径
:param queue_obj: 队列对象
:return:
"""
with open(file_path) as f:
for line in f:
queue_obj.put(line.strip())
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
"""
def encrypted_0908(phone: str, dept_code: str):
"""
多线程来完成加密、写入工作(加锁和释放锁)
:param phone:手机号
:param dept_code: 网点编码
:return:
"""
data_json = {"mobile": phone, "spNet": dept_code, "qq": 153132336, "blog": "https://blog.csdn.net/zyooooxie"}
data_json = json.dumps(data_json, ensure_ascii=False)
res = encrypt_func(encrypt_str=data_json, key='zyooooxie')
Log.info('{}-{}'.format(threading.currentThread().getName(), res))
gl_Lock.acquire()
gl_res_list.append(res)
# write_txt(res)
gl_Lock.release()
def main1(all_data_len: int = 50000):
"""
多线程的执行方法(传 最终结果list的长度,在执行时 若长度满足,即结束;不满足时,无限起50个线程来完成;)
:param all_data_len:
:return:
"""
put_queue(r'D:\program\mobile.txt', q_phone)
put_queue(r'D:\program\dept_code.txt', q_dc)
Log.info('方法{}:生成总共{}条记录'.format(sys._getframe().f_code.co_name, all_data_len))
while True:
thread_list = list()
for i in range(50):
thread_name = f'thread_{i}'
phone, dc = q_phone.get(), q_dc.get()
t = threading.Thread(target=encrypted_0908, args=(phone, dc), name=thread_name)
thread_list.append(t)
q_phone.put(phone)
q_dc.put(dc)
for t in thread_list:
t.start()
for t in thread_list:
t.join()
if len(gl_res_list) >= all_data_len:
break
write_txt(gl_res_list)
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
"""
def encrypted_0915(queue_phone: queue.Queue, queue_dc: queue.Queue, number_of_cycles: int):
"""
使用for循环来完成加密、写入工作(每次从队列取参数、调加密方法、将结果放到最终结果list、参数放回队列)
:param queue_phone: phone的队列
:param queue_dc: dept_code的队列
:param number_of_cycles:循环次数
:return:
"""
# Log.info(number_of_cycles)
for _ in range(number_of_cycles):
phone = queue_phone.get()
dc = queue_dc.get()
data_json = {"mobile": phone, "spNet": dc, "qq": 153132336, "blog": "https://blog.csdn.net/zyooooxie"}
data_json = json.dumps(data_json, ensure_ascii=False)
res = encrypt_func(encrypt_str=data_json, key='zyooooxie')
Log.info('{}-{}'.format(threading.currentThread().getName(), res))
gl_res_list.append(res)
queue_phone.put(phone)
queue_dc.put(dc)
def main3(all_data_len: int = 50000):
"""
for循环的执行方法(得到最终结果、统一写入文件)
:param all_data_len:总长度
:return:
"""
put_queue(r'D:\program\mobile.txt', q_phone)
put_queue(r'D:\program\dept_code.txt', q_dc)
Log.info('方法{}:生成总共{}条记录'.format(sys._getframe().f_code.co_name, all_data_len))
encrypted_0915(q_phone, q_dc, all_data_len)
write_txt(gl_res_list) # 将所有加密字符串写入txt文件
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
"""
if __name__ == '__main__':
pass
time_1 = time.time()
Log.info(time_1)
all_len = 20000
# main1(all_data_len=all_len)
main3(all_data_len=all_len)
time_2 = time.time()
Log.info(time_2)
time_3 = time_2 - time_1
Log.info('实际花费时间是:{}秒'.format(time_3))
Log.info('实际花费时间是:{}分钟'.format(time_3 / 60))
这是一个计算密集型任务,多线程和for循环 对比,是for循环更高效一些。
本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427