Python多线程使用(一)

一、多线程使用

1.使用threading库

# 使用threading进行调用多线程
from threading import Thread

2.使用

(1)使用函数方法

thread = Thread(target=方法对象,             #不要括号args=('参数1', '参数2')      #一个参数也需要加上逗号
)
# 创建一个线程对象
​
thread.start()
# 执行线程对象

(2)使用类方法

import threading
import timeclass TestThread(threading.Thread):def __init__(self, n):super(TestThread, self).__init__()self.n = ndef run(self):print('TestThread类的类方法方式创建多线程', self.n)time.sleep(0.5)t1=TestThread("参数1")
t2=TestThread("参数2")

3.小demo

from threading import Thread
from time import sleepdef work(name):for i in range(5):print(name)sleep(0.5)t1 = Thread(target=work,args=('名字A',)
)
t2 = Thread(target=work,args=('名字B',)
)
t1.start()
t2.start()
print('---结束---')
# 执行结果
"""
名字A
名字B
---结束---
名字A名字B
名字A名字B
名字B名字A
名字A名字B
Process finished with exit code 0两个子线程开始后,主线程从上到下运行结束,但两个子线程t1/t2还在运行
"""

4.等待执行

从demo中可以发现,主线程结束了两个子线程还没结束,使用join方法可以让主线程等待子线程执行完成后结束。

#使用方法join,其目的是加入主线程等待
from threading import Thread
from time import sleepdef work(name):for i in range(5):print(name)sleep(0.5)t1 = Thread(target=work,args=('名字A',)
)
t2 = Thread(target=work,args=('名字B',)
)
t1.start()
t2.start()
t1.join()
t2.join()print('---结束---')
"""
名字A
名字B
名字A
名字B
名字B
名字A
名字A
名字B
名字B
名字A
---结束---
Process finished with exit code 0将t1和t2加入主线程,主线程在等待t1/t2运行结束后,才结束运行
"""

二、多线程压测构思

以最常使用压测的场景:秒杀活动订单 为例子

1.生成随机且未注册手机号并登录
    -> 存数据为{“手机号”:“登录token”},多个使用列表遍历
2.访问商品列表
    -> 读取秒杀商品,有多个选择第一个
3.秒杀商品提交订单
    -> 断言结果为success

不考虑其他操作和环境限制

三、实现

以秒杀商品订单为例,创建"skilOrder"包,py文件以"sk_"开头

1.工具类

# 工具类
ToolMySQL -> 输入sql查询库并返回结果
ToolFakerDate -> 生成一个库里未使用过的手机号

2.sk_variable.py

"""
存储公共使用变量
"""class Variable:pass

3.sk_setting.py

# 存放各类url
url1 = ''
url2 = ''
url3 = ''# 存放请求头
header = {'Content-Type': 'application/json','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36','xxx':'xxx',...
}# 存放skillOrder中需要的前置条件/变量

4.sk_register.py

import requests
from jsonpath import jsonpathfrom seckillorder.sk_setting import 注册_url, head
from seckillorder.sk_variable import Variable
from 工具类 import ToolFakerDateclass RegisterLogin:# 注册并登录,存储登录信息[{“手机号”:“登录token”},...]# 设置成Variable类属性def __init__(self,times):self.times = timesself.fakerphone = ToolFakerDate()def fakerphonelist(self):register_list = []num = 0while num < self.times:c = self.fakerphone.get_new_phone()if c not in register_list:register_list.append(c)num += 1log.info("生成的手机号列表:", register_list)return register_listdef reslogin(self):log.info("-------------reslogin_start---------------")register_list = self.fakerphonelist()login_info = {}for i in register_list:data = {"xxx":"xxx",.......# 根据注册接口所需参数填写}resq = requests.post(url=tes_url, headers=header, json=data)if jsonpath(resq.json(),'msg')[0] == 'success':print(i, resq.text)login_info[f'{i}'] = jsonpath(resq.json(),'token')[0]setattr(Variable, 'login_info', login_info)log.info('login_info', login_info)log.info("-------------reslogin_end---------------")

5.sk_product.py

import json
from threading import Threadimport requests
from jsonpath import jsonpathfrom seckillorder.sk_setting import 商品列表_url, head, 下单_url
from seckillorder.sk_variable import Variableclass GetProduce:# 获取商品列表信息,查找对应秒杀商品并暂存# 设置成Variable类属性def getproduceinfo(self):resq = requests.get(url=商品列表_url, headers=head)for i in resq返回的内容:# 从响应体中去获取提交秒杀商品订单需要的参数def orderinfo(token):data = [{"xxx":"xxx",# 提交订单所需要的参数}]header['token'] = tokenresq = requests.post(url=下单_url, headers=head, json=data)log.info(token, resq.text)log.info(header)class SumbimOrder:def SubmitOrder(self, method, token):theadlist = []for k, v in token.items():log.info(k, v)thread = Thread(target=method,args=(v,))theadlist.append(thread)thread.start()for thread in theadlist:thread.join()

四、写在最后

写在最后:

感觉不像是想象中的多线程压测脚本

在创建完线程时候就已经完成下单了,并发下单才有压测的感觉

断言只需要查库判断对应订单号是否创建和订单支付状态即可

写着玩,图个乐

欢迎大佬指点迷津!!!

 

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

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

相关文章

我的128天创作纪念日

嘿&#xff0c;大家好&#xff01;今天我想和大家聊一聊CSDN创作者128天纪念日的话题。 机缘 首先&#xff0c;让我们来谈谈机缘。作为CSDN创作者&#xff0c;我们都有自己的创作机缘。可能是因为对某个领域感兴趣&#xff0c;可能是因为想要分享自己的知识和经验&#xff0c…

网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

网络爬虫&#xff08;Python&#xff1a;Selenium、Scrapy框架&#xff1b;爬虫与反爬虫笔记&#xff09; SeleniumWebDriver 对象提供的相关方法定位元素ActionChains的基本使用selenium显示等待和隐式等待显示等待隐式等待 Scrapy&#xff08;异步网络爬虫框架&#xff09;Sc…

【docker系列】docker高阶篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 2.镜像结构 镜…

5G NSA注册解析及图标显示方案

5G NSA注册解析及图标显示方案 1. NSA注册流程解析1.1 NSA注册流程1.2 NAS消息信元变化1.3 UE能力信元变化1.3.1 第一次UE能力查询1.3.2 后续UE能力查询1.3.3 UE能力过滤器解析 1.4 UE测量配置1.5 SCG添加消息解析1.6 SCG添加成功1.7 Split Bearer承载的建立1.8 NR协议查询索引…

华为OD机试 - 围棋的气(Java JS Python C)

题目描述 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可…

解决OSError: [Errno 28] No space left on device报错和搭建AIrtest无线配置手机集群

OSError: [Errno 28] No space left on device和搭建AIrtest无线配置手机集群 做手机无限集群控制时&#xff0c;常常遇到这种错误问题。表示您的设备上没有足够的可用磁盘空间来完成某个操作。我们遇到了还得重新开端口和输入ip&#xff0c;如果有几百台手机是不是中午就不吃…

【古诗生成AI实战】之五——加载模型进行古诗生成

回顾上一篇博客&#xff0c;我们已经成功地训练了我们的模型&#xff0c;并将其保存下来。这是一个重要的里程碑&#xff0c;因为训练好的模型是我们进行文本生成的基础。 现在&#xff0c;接下来的步骤是加载这个训练好的模型&#xff0c;然后使用它来生成古诗。 本章的内容属…

2023年网络安全比赛--综合渗透测试②(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将扫描开放的所有端口当作flag提交(例:21,22,23); 2.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将初…

人工智能-优化算法和深度学习

优化和深度学习 对于深度学习问题&#xff0c;我们通常会先定义损失函数。一旦我们有了损失函数&#xff0c;我们就可以使用优化算法来尝试最小化损失。在优化中&#xff0c;损失函数通常被称为优化问题的目标函数。按照传统惯例&#xff0c;大多数优化算法都关注的是最小化。…

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口&#xff08;屏幕&#xff09;坐标系 变换 仿射变换和线性变换线性&#xff1a;旋转 缩放 镜像 切变放射&#xff1a; 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

【docker系列】docker命令篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中科亿海微除法器(DIVIDE)

技术背景 技术概述 FPGA实现除法运算是一个比较复杂的过程&#xff0c;因为硬件逻辑与软件程序的区别。如果其中一个操作数为常数&#xff0c;可以通过简单的移位与求和操作代替&#xff0c;但用硬件逻辑完成两变量间除法运算会占用较多的资源&#xff0c;电路结构复杂&#xf…

数据结构 / 顺序表的遍历

1. 顺序表的遍历函数代码 /**判断顺序表是否为空* */int is_list_empty(sqlist *list) {return list->len 0 ? 1 : 0; }/**顺序表遍历** */void output(sqlist *list) {if(NULLlist||1is_list_empty(list)){printf("list is NULL!\n");return;}for(int i0; i&…

【虚拟机Ubuntu 18.04配置网络】

虚拟机Ubuntu 18.04配置网络 1.配置网络连接方式,查看自己网关 2.修改主机名 3.修改系统配置1.配置网络连接方式,查看自己网关 选择虚拟机镜像设置网络连接模式,可以选择桥接或者NAT连接(我这里选择是NAT连接) 确定自己网关&#xff0c;可以在虚拟机 -》 编辑 -》虚拟网络编…

springboot(ssm高校大学生评奖评优系统 奖学金管理系统Java(codeLW)

springboot(ssm高校大学生评奖评优系统 奖学金管理系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.…

TypeScript和JavaScript有什么不同

TypeScript是JavaScript的一个超集&#xff0c;它添加了静态类型检查和其他一些高级特性。下面是TypeScript和JavaScript之间的一些主要区别&#xff1a; 类型系统&#xff1a;TypeScript引入了静态类型检查&#xff0c;可以在开发过程中捕获潜在的类型错误&#xff0c;并提供更…

Kubernetes之kubeadm集群部署篇—k8s集群部署

文章目录 1、启动集群1.1 新增 kubernetes yum源&#xff1a;(所有节点)1.2 安装kubelet kubeadm kubectl &#xff08;master节点&#xff09;1.3 启动k8s-master节点 &#xff08;master节点&#xff09; 二、部署 flannel &#xff08;master节点&#xff09;2.1 下载flanne…

SpringBoot通过URL请求图片方法

通过URL请求图片方法 来源 如果你想通过controller动态返回图片&#xff0c;你可以参考以下示例代码:java // 使用PathVariable注解&#xff0c;获取请求路径中的参数 GetMapping(value "/image/{name}", produces MediaType.IMAGE_JPEG_VALUE) ResponseBody pub…