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 ...
随机推荐
- 概率dp呜呜
概率dp有环怎么办? 答案可劲迭代 ,然后可劲消元 , 怎么消? 我就不知道了. 呵呵
- ajax接收json数据到js解析
今天又学到了一点新知识,脑子记不住东西特把它记录下来! 页面ajax请求后台时一般都是返回字符串进行判断,要是返回list或者对象时该怎么办? 第一种:ajax接收到list并返回给前台 js代码: ...
- struct init
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...
- Java Web 总结
Java Servlet 总结 Servlet 简介 Servlet 是什么? 运行在Web服务器上的应用程序,作为浏览器和服务器之间的中间层. 与CGI功能类似,优点在于 性能更好 在Web服务器的 ...
- Layui颜色
Layui颜色 视觉疲劳的形成往往是由于颜色过于丰富或过于单一形成的麻木感,而 layui 提供的颜色,清新而不乏深沉,互相柔和,不过分刺激大脑皮层的神经反应,形成越久越耐看的微妙影像.合理搭配,可与 ...
- hibernate详解一
hibernate介绍 hibernate是一个开源的轻量级的框架, hibernate框架应用在javaee三层结构中的dao层框架,在dao层对数据库进行crud操作,使用hibernate框架实 ...
- 用Java开发50个棋类游戏
眼下已经开发完了两个 1A2B 24点 打算开发以下的.直接在QQ上玩. QQ机器人已经有了.我们直接写业务即可.有兴趣的參与.机器人婷婷体验群 Java技术交流 207224939 四棋 小枪大炮 ...
- hive中使用正則表達式不当导致执行奇慢无比
业务保障部有一个需求,须要用hive实时计算上一小时的数据.比方如今是12点,我须要计算11点的数据,并且必须在1小时之后执行出来.可是他们用hive实现的时候发现就单个map任务执行都超过了1小时, ...
- 2015 Multi-University Training Contest 9-1007 Travelling Salesman Problem
Problem Description Teacher Mai is in a maze with n rows and m columns. There is a non-negative numb ...
- C#.NEt-GDI+中的Pen測试
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...