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

news2025/1/11 14:21:19

本文为博主原创,未经授权,严禁转载及使用。
本文链接: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Class11

Java Class11 集合 概念 集合是用于存储对象的工具类容器,实现了常用的数据结构,提供了一系列公开的方法用于删除、修改、查找和遍历数据,降低了日常开发成本。 三种集合 Set set集合中元素是无序、不可重复的 List list集合中元素是从前到…

公众号免费搜题功能搭建

公众号免费搜题功能搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转&#xf…

基于C语言实现进度条 | 附源码

进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否。 那么 ,一个进度条有哪些元素呢: 一个不断向右生长的容器(直观的看出当前的进度) …

Spring的循环依赖问题

Spring中循环依赖场景有: 构造器的循环依赖(构造器注⼊) Field 属性的循环依赖(set注⼊) 各场景下循环依赖解决的情况 单例 bean 构造器参数循环依赖(⽆法解决) 构造器在Bean的生命周期中实例…

GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯,大家好! 没错,又是我,还跟前面一样,有好东西我才会出现。那是什么好东西呢?今天啊,给他分享阿里在Github最新发布的spring全家桶笔记第九版,这份笔记一共分三份:sp…

G1垃圾回收器

概述 官网 https://docs.oracle.com/en/java/javase/16/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573 简介 G1垃圾回收器可以同时回收新生代和老年代的对象,不需要两个垃圾回收器配合起来运作,他一…

高项 进度管理论文

七个过程: 项目进度管理包括为管理项目按时完成所需的7个过程,具体为: (1)规划进度管理:为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档过程。 (2)定义活动&…

【C语言】初阶指针的简单使用 _指针运算 指针和数组的关系[初阶篇 _学习专用]

1.指针是什么? 在学习指针的时候,我们经常会看到下面这段代码: int main() {int a 10;int* pa &a;*pa 20; } 之前并没有接触过指针的朋友们看到后可能是一头雾水,根本不知道从哪里去理解;下面我们就通过一些…

STM32开发时HardFault错误的排查

STM32开发时HardFault错误的排查 本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。 故障现象 做STM32开发,经常遇到HardFault错误,也就是程序不会正常运行&…

WPF动画(2)

动画的生命周期 从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的 值,当动画处于活动状态时,只是覆盖了属性的值 。 单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要…

(十一)手写简单的Spring框架

文章目录第一步:搭建环境第二步:准备好要管理的Bean第三步:准备myspring.xml配置文件第四步:编写MyApplicationContext接口第五步:编写MyClassPathXmlApplicationContext第六步:采用Map集合存储Bean第七步&…

第十一章 Golang面向对象编程(下)

面向对象编程三大特性 基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其他OOP语言不一样。 封装 面向对象编程思想-抽象 我们在前面去定义一个结构体的时候,实际上就是把一类事物共有的属性(字段…

Presto 之 explain and explain analyze的实现

一. 前言 本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会…

JVM常用参数

JVM内存相关的几个核心参数 -Xms:Java堆内存初始大小-Xmx:Java堆内存的最大大小-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了-XX:PermSize:永久代大小-XX:MaxPermSize:永久代最…

疾控物资管理系统-疾控中心物资管理系统

一、系统概述 东识科技(DONWIT)疾控中心物资管理系统(智物资DW-S300)是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 随着疫情的突…

(STM32)从零开始的RT-Thread之旅--GPIO

上一篇: (STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置 无论什么开发板,最先调试的肯定是GPIO,一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用,没有具体分析RTT框架实现。 首先先创建一个BSP文件夹&…

机器人操作系统ROS(21) jetson nano安装torch tensorflow

安装torch、tensorflow其实跟普通在Linux系统安装没有区别,但是Linux是arch64位的,而jetson是aarch64位的,所以还是不太一样。 另外一个坑是:购买的创乐博的机器人,已经安装ros,但是安装torh的时候需要apt …

使用Spring实现工厂+策略模式

使用Spring实现工厂策略模式 这里使用发短信业务&#xff1a; 不同短信有不同模板但是发送方法都相同只是发送内同不同 1. 定义短信发送策略接口&#xff1a; //策略接口 public interface SmsTemStrategy {public void sendSms(Map<String,String> params); }2.短信…

【Python】Numpy傅里叶变换总结

文章目录简介fft简介 Fourier变换极其逆变换在数学上的定义如下 F(ω)∫−∞∞f(t)e−iωtdtf(t)π2∫−∞∞F(ω)eiωtdωF(\omega)\int^\infty_{-\infty}f(t)e^{-i\omega t}\text dt\\ f(t)\frac{\pi}{2}\int^\infty_{-\infty}F(\omega)e^{i\omega t}\text d\omega F(ω)∫−…

飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发

目录 0. Introduction of Jetson Developer kits 1. 硬件对比 Jetson 模组系列 Jetson AGX Orin 系列 Jetson Orin NX 系列 Jetson AGX Xavier 系列 Jetson Xavier NX 系列 Jetson TX2 系列 Jetson Nano 2. 应用场景 1. Introduction of AGX Xavier Taking Perform…