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 ...
随机推荐
- android 实现照相功能 照片存放在SID卡中,将照片显示在Image中
protected static final int CAMERA_RESULT = 0; private String fileName; private Button takePhotoBn; p ...
- 2018/4/7 Mybatis源码结构概览
在观看Mybatis源码的过程中,有一点疑惑,就是Mybatis的缓存设计明显有问题,首先,Mybatis缓存分为两级,先说一级,生命周期为一个sqlsession,只有在查询相同方法时才会命中缓存, ...
- 2015山东信息学夏令营 Day4T3 生产
2015山东信息学夏令营 Day4T3 生产 [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品 ...
- hdu - 1172 猜数字 (思维题)
http://acm.hdu.edu.cn/showproblem.php?pid=1172 这个题换一种想法,可以找出四位数中所有满足条件的数看是否只有一个. #include <iostre ...
- 洛谷 P2237 [USACO14FEB]自动完成Auto-complete
P2237 [USACO14FEB]自动完成Auto-complete 题目描述 Bessie the cow has a new cell phone and enjoys sending text ...
- MySql command line client 命令系列
—————————————————————————————————————————————————————————— 一.启动与退出 1.进入MySQL:启动MySQL Command Line Cl ...
- EJB之JPA
在前一篇文章中大概了解了EJB是什么?那么接下来就进一步介绍一下它与JPA有什么样的关系?及什么是JPA?JPA怎样用? 一.是什么? 第一次听说JPA是在EJB视屏中,所以一直感觉他们有不解的渊源. ...
- Oracle新建数据库
确定楼主是以管理员身份登录的:1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password ...
- Java后端发出post请求带参数并接收返回的json
核心代码: 参数格式: “key1=value1&key2=value2” /*** sendUrl (远程请求的URL)* param (远程请求参数)* JSONObject ...
- 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)
为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...