python自动化测试学习笔记-8多线程
线程模块
python的多线程只能利用cpu的一个核心,一个核心同时只能运行一个任务那么为什么你使用多线程的时候,它的确是比单线程快
答:如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点确实是比较吃亏的,每个线程运行一遍,就相当于单线程再跑,甚至比单线程还要慢——CPU切换线程的上下文也是要有开销的。
但是,如果是一个磁盘或网络为主的程序(IO密集型)就不同了。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,
而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的,python的多线程就在这时候发挥作用了。比方说多线程网络传输,多线程往不同的目录写文件,等等。
Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。
threading 模块提供的其他方法:
- threading.currentThread(): 返回当前的线程变量。
- threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
- threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
- run(): 用以表示线程活动的方法。
- start():启动线程活动。
- join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
- isAlive(): 返回线程是否活动的。
- getName(): 返回线程名。
- setName(): 设置线程名。
定义一个线程:
def learn(name,age):
print('my name is %s ,%s years old ,i like swim '%(name,age))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
t=threading.Thread(target=learn,args=('wang',34))
t.start()
如果要启动多个线程,可以使用循环实现:
users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(10)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.start() print('主线程结束')
查看执行结果:
主线程结束
my name is wang ,34 years old ,i like swim
my name is li ,23 years old ,i like travel
my name is zhao ,14 years old ,i like reading
Python中,默认情况下,如果不加join语句,那么主线程不会等到当前线程结束才结束,但却不会立即杀死该线程
我们看到上边的代码,执行后,先结束了主线程,但子线程还在执行中,10秒以后子线程结束,为了避免这种情况,我们可以使用join来是子线程进行等待,join是阻塞当前线程,即使得在当前线程结束时,不会退出。
users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(5)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
threads=[]
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.start()
threads.append(t)
for t in threads:
t.join()#主线程等待子线程结束 print('主线程结束')
执行查看结果:
my name is li ,23 years old ,i like travel
my name is zhao ,14 years old ,i like reading
my name is wang ,34 years old ,i like swim
主线程结束
守护线程:setDaemon(True),设置之后如果不加join语句,当主线程结束后,会杀死子线程
users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(5)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
threads=[]
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.setDaemon(True)
t.start() print('主线程结束')
执行查看结果:
主线程结束
我们看到,不加setDaemon(True)的时候,主线程结束之后,子线程没有立即结束,是在执行完之后结束的。添加setDaemon(True),主线程结束后子线程立即结束。
线程池:我们上面用到的循环的方式开启了多个线程,python中可以使用第三方的包threadpool线程池包,实现处理线程问题
安装:pip install threadpool
(1)引入threadpool模块
import threadpool
#定义线程函数
def say(num):
print(num) #创建线程池
pool=threadpool.ThreadPool(3)
#生成线程池要执行的东西,makeRequests,传入数量,自动找出每个线程要执行的数据
reqs=threadpool.makeRequests(say,list(range(11)))
#创建多个任务put到线程池中
for req in reqs:
pool.putRequest(req)
pool.wait()
执行:
0
1
2
3
4
5
6
7
8
9
10
现在我们可以来封装一个线程池了:
import threadpool class MyPool(object):
def __init__(self,func,poolsize=10,data=None):
self.func=func
self.poolsize=poolsize
self.data=data
def pool(self):
pool=threadpool.ThreadPool(self.poolsize)
reqs=threadpool.makeRequests(self.func,self.data)
[pool.putRequest(req) for req in reqs]
pool.wait()
我们定义一个简单的函数来调用一下:
def say(num):
print(num) my=MyPool(say,2,[1,2,3,4,5])
my.pool()
python自动化测试学习笔记-8多线程的更多相关文章
- Python Web学习笔记之多线程编程
本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...
- python自动化测试学习笔记-10YAML
之前学习的编写测试用例的方法,都是从excel中编写接口的测试用例,然后通过读取excel文件进行接口自动化测试,这种方式我们叫做数据驱动的方式,由于excel操作起来不灵活,无法实现关联关系的接口测 ...
- python自动化测试学习笔记-1
一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行测试用例进行测试: 二.python ...
- python自动化测试学习笔记-9测试框架
学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:
- python自动化测试学习笔记-6urllib模块&request模块
python3的urllib 模块提供了获取页面的功能. urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capat ...
- python自动化测试学习笔记-5常用模块
上一次学习了os模块,sys模块,json模块,random模块,string模块,time模块,hashlib模块,今天继续学习以下的常用模块: 1.datetime模块 2.pymysql模块(3 ...
- python自动化测试学习笔记-4常用模块
常用模块 1.os 2.sys 3.random 4.string 5.time 6.hashlib 一.os模块 os模块主要用来操作文件.目录,与操作系统无关.要使用os模块首先要导入OS模块,用 ...
- python自动化测试学习笔记-4内置函数,处理json
函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改,其次全局变量会一直占用系统内容. 2.函数里如果有多个r ...
- python自动化测试学习笔记-2-列表
上次我们学习了python的基本概念,了解了python的变量及数据类型,并实战了条件判断,for/while循环,字符串输出,格式化输出的一些基本用法,接下来我们继续学习其他的一些数据类型. pyt ...
随机推荐
- 【计算几何+极角排序+爆ll】E. Convex
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...
- zset(sorted set:有序集合)数据类型【八】
一.概述:(zset) Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数 ...
- CLR运行机制
CLR编译器会将我们的代码编译成托管模块(中间IL语言和元数据),托管模块是一个标准的PE32执行文件,或者PE32+执行文件.但是CLR实际不和托管模块一起工作,他会将托管模块合并成程序集,程序集是 ...
- Eclipse完成Maven + Spring Boot + Mybatis + jsp
Spring Boot 完成WEB项目开发 开发工具:eclipse 框架:Maven:Spring Boot:Mybatis 界面:jsp:javascript:css 前言: 在SpringBoo ...
- 洛谷 P4057 [Code+#1]晨跑
P4057 [Code+#1]晨跑 题目描述 “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生 ...
- Ubuntu 16.04下操作iptables的技巧(解决Failed to start iptables.service: Unit iptables.service not found.或者/etc/init.d/iptables: 没有那个文件或目录)
/etc/init.d/iptables网上的解法应该都是基于CentOS 6去实践,而在CentOS 7中又被firewalld给取代,所以操作上的写法基本会改变,但是底层iptables则不会改变 ...
- linux命令dmesg查看进程被杀死原因
有一次一个python进程挂了,使用了下这个命令. 可以看到原因:虚拟机总共内存8082608KB,结果python项目就消耗掉了7341764KB,内存泄露,导致python进程被系统杀死 顺带介绍 ...
- 异 形 卵 709 南阳oj
http://acm.nyist.net/JudgeOnline/problem.php? pid=709 异 形 卵 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 ...
- myEclipse怎样将程序部署到tomcat(附录MyEclipse调试快捷键)
部署 1.选中你要部署的项目,在工具栏找到 Deploy MyEclipse J2EE Project to Server 2.单击Add,即出现例如以下界面.选择对应的Server,要和你在配置to ...
- vux 全局使用 loading / toast / alert
1.入口文件 main.js import { LoadingPlugin, ToastPlugin, AlertPlugin } from 'vux' Vue.use(LoadingPlugin); ...