Python脚本之并发执行加密方法【一】

本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427

之前写过一篇 JMeter性能测试之参数加密【一】,现在把后面的补上。实际第一篇就写完了 JMeter压测遇到加密接口的处理方式,此篇内容全部为扩展。

【实际这篇博客推迟发布N个月】

个人博客:https://blog.csdn.net/zyooooxie

【以下所有内容仅为个人项目经历,如有不同,纯属正常】

方案2-加密 在 JMeter外 完成

压测脚本:使用param.txt参数化+直接请求

请求

在这里插入图片描述

参数化

在这里插入图片描述

压测报告

在这里插入图片描述

Python代码 生成param.txt

数据准备: 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)

使用for循环

"""
@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

个人博客 https://blog.csdn.net/zyooooxie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值