• 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    """
    @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())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    使用多线程

    """
    @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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    使用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文件
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行

    """
    @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))
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这是一个计算密集型任务,多线程和for循环 对比,是for循环更高效一些。

    本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427

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

  • 相关阅读:
    Mysql数据库
    数据库技术基础--关系数据库
    mysql 数据库在liunx 上的备份和恢复
    vue3中使用vue-echarts
    Javaweb之Servlet介绍
    sky walking日志采集以及注意事项
    华为S5700交换机初始化和配置SSH和TELNET远程登录方法
    【FPGA教程案例34】通信案例4——基于FPGA的QPSK调制信号产生,通过matlab测试其星座图
    什么是分布式锁?几种分布式锁分别是怎么实现的?
    二分图匹配(Hopcroft-Carp 的算法)
  • 原文地址:https://blog.csdn.net/zyooooxie/article/details/125650427