Selenium 2自动化测试实战41(多线程技术)
多线程技术
python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的,原始的线程以及一个简单的锁。threading基于Java的线程模型设计。
1.threading模块
应该避免使用thread模块,原因是它不支持守护线程。当主线程退出时,所有的子线程不管他们是否还在工作,都会被强行退出。有时候并不希望出现此种行为,因此就引入了守护线程的概念。threading模块支持守护线程,所以,我们直接使用threading来改进上述的例子。
#threads.py
#coding:utf-8
from time import sleep,ctime
import threading #听音乐任务
def music(func,loop):
for i in range(loop):
print('i was listening to %s! %s' % (func,ctime()))
sleep(2) #看电影任务
def movies(func,loop):
for i in range(loop):
print('i was watch the %s!%s' %(func,ctime()))
sleep(5) #创建线程数组
threads=[] #创建线程t1,并添加到线程数组
t1=threading.Thread(target=music,args=(u'爱情买卖',2))
threads.append(t1) #创建线程t2,并添加到线程数组
t2=threading.Thread(target=movies,args=(u'阿凡达',2))
threads.append(t2) if __name__=="__main__": #启动线程
for t in threads:
t.start()
#守护线程
for t in threads:
t.join()
print ('all end %s' %ctime())
执行之后,结果如下图所示:

-import threading:引入线程模块
-threads=[]:创建线程数组,用于装载线程。
-threading.Thread():通过调用threading模块的Thread()方法来创建线程。
通过for循环遍历threads数组中所装载的线程,start()开始线程活动,join()等待线程终止。如果不使用join()方法对每个线程做等待终止,那么在线程运行的过程中可能会去执行最后的打印“all end…”
代码分析:
从上面的运行结果可以看出,两个子线程(music/movie)同时启动于46分09秒,直到所有线程结束于46分19秒,总耗时10秒,movie的两次电影循环共需要10秒,music的歌曲循环需要4秒,从执行结果看出两个线程达到了并行工作。
2.优化线程的创建
上述例子中,每创建一个线程都需要创建一个t(t1,t2,……),当创建的线程较多时,这样不方便,因此下面例子将作出改进。
#player.py
#coding:utf-8
from time import sleep,ctime
import threading #创建超级播放器
def super_player(file_,time):
for i in range(2):
print 'Start playing:%s! %s' %(file_,ctime())
sleep(time) #播放的文件与播放时长
lists={u'爱情买卖.mp3':3,u'阿凡达.mp4':5,u'我和你.mp3':4} threads=[]
files=range(len(lists)) #创建线程
for file_,time in lists.items():
t=threading.Thread(target=super_player,args=(file_,time))
threads.append(t) if __name__=="__main__":
#启动线程
for t in files:
threads[t].start() for t in files:
threads[t].join() print 'all end"%s' %ctime()
执行之后,结果如下图所示:

此例中,对播放器的功能也做了增强,首先,创建了一个super_player()函数,这个函数可以接收播放文件和播放时长,可以播放任何文件。
然后,我们创建了一个lists字典用于存放播放文件名与时长,通过for循环读取字典,并调用super_player()函数创建字典,接着将创建的字典都追加到threads数组中。
3.创建线程类
除直接使用python所提供的线程类外,还可以根据需求自定义自己的线程类。
#mythread.py
#coding:utf-8
from time import sleep,ctime
import threading #创建线程类
class MyThreads(threading.Thread): def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.func=func
self.args=args
self.name=name def run(self):
self.func(*self.args) def super_play(file_,time):
for i in range(2):
print('Start playing:%s! %s' %(file_,ctime()))
sleep(time) lists={u'爱情买卖.mp3':3,u'阿凡达.mp4':5,u'我和你.mp3':4} threads=[]
files=range(len(lists)) for file_,time in lists.items():
t=MyThreads(super_play,(file_,time),super_play.__name__)
threads.append(t) if __name__=='__main__':
#启动线程
for i in files:
threads[i].start() for i in files:
threads[i].join() print'all end:%s' %ctime()
执行之后,结果如下图所示:

MyThreads(threading.Thread)
创建MyThread类,用于继承threading.Thread类
__init__()类的初始化方法对func、args、name等参数进行初始化。
在python2中,apply(func[,args[,kwargs]])函数的作用是当函数参数已经存在于一个元组或字典中,apply()间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,则任何参数都不会被传递,kwargs是一个包含关键字参数的字典。
Python3中已经不再支持apply()函数,所以将
-apply(self.func,self.args)
修改为
Self.func(*self.args)
最后,线程的创建与启动与前面的例子相同,唯一的区别是创建线程使用的是MyThreads类,线程的入参形式也有所改变。
Selenium 2自动化测试实战41(多线程技术)的更多相关文章
- Selenium 2自动化测试实战
Selenium 2自动化测试实战 百度网盘 链接:https://pan.baidu.com/s/1aiP3d8Y1QlcHD3fAlEj4sg 提取码:jp8e 复制这段内容后打开百度网盘手机Ap ...
- Selenium 2自动化测试实战3(函数、类和方法)
一.函数.类和方法1.函数在python中通过def关键字来定义函数 创建一个add()函数,此函数接收两个参数a,b,通过print()打印a+b的结果.调用add()函数,并且上传两个参数3,5给 ...
- 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法
虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...
- Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记
背景 最近在弄 appium,然后顺便发现了 Selenium 框架和这本书,恰好这本书也介绍了一些软件测试&自动化测试的理论知识,遂拿过来学习学习.所以本文几乎没有实践内容,大多都是概念和工 ...
- Selenium 2自动化测试实战18(上传文件)
一.上传文件 上传文件是比较常见的web功能之一,但WebDriver没有提供专门用于上传的方法. 一般web页面的上传功能的操作需要单击“上传”按钮后打开本地的Window窗口,从窗口选择本地文件进 ...
- Selenium+Python自动化测试实战(2)元素定位
1.Selenium2 的原理 第一篇分享简单介绍了基于Python开发的Selenium2的环境配置,这篇主要讲一下基本用法.首先讲一下Selenium2的基本原理.基本上知道了这个东西是怎么回事, ...
- Selenium 2自动化测试实战39(Page Object设计模式)
Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...
- Selenium 2自动化测试实战35(HTML测试报告)
HTML测试报告 显然,一份漂亮的测试报告展示自动化测试成果只有一个简单的log文件是不够的.HTMLTestRunner是python标准库unittest单元测试框架的一个扩展,它生成易于使用的H ...
- Selenium 2自动化测试实战34(编写Web测试用例)
编写Web测试用例 1.介绍了unittest单元测试框架,其主要是来运行Web自动化测试脚本.简单的规划一下测试目录:web_demo1/------test_case/------------te ...
随机推荐
- kubernetes之pod生命周期,pod重启策略, 镜像拉取策略
pod声明周期(状态):pending , running, succeeded, failed, unknown 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多 ...
- 完整开发vue后台管理系统小结
最近业余帮朋友做两个vue项目,一个是面向用户纯展示系列的(后统称A项目),一个是后端管理系统类的(后统称B项目).两者在技术上都没难度,这里对开发过程遇到的问题.取舍等做一个小节. 关于项目搭建 目 ...
- PHP常见设计模式
简单工厂 <?php # 简单工厂 abstract class mycoach { public function __construct(){} } class cultivatecpc e ...
- API接口防止参数篡改和重放攻击
{近期领导要求我对公司业务的支付类的ocr接口做研究,是否存在支付接口重放攻击,so.....} API重放攻击(Replay Attacks)又称重播攻击.回放攻击.他的原理就是把之前窃听到的数据原 ...
- Educational Codeforces Round 73 (Rated for Div. 2) B. Knights(构造)
链接: https://codeforces.com/contest/1221/problem/B 题意: You are given a chess board with n rows and n ...
- 无法识别的配置节点 applicationSettings/* Properties.Settings 解决方法
http://blog.csdn.net/yaoxtao/article/details/7766888 在项目中引用web service时,偶然出现 无法识别的配置节点 applicationSe ...
- js上传整个文件夹
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- 如何检测域名是否被微信屏蔽 微信域名检测接口API是如何实现
微信域名检测技术的主要用户是微信域名防封,大家知道拼多多这种网站,靠诱导分享方式在微信里面摇身一变已经估值160亿美元,身价仅次于京东了 ,这是何等的速度,简直是惊为天人,but 如果你想玩微信病毒营 ...
- c str to float
#include <wchar.h> int main () { wchar_t szOrbits[] = L"365.24 29.53"; wchar_t * pEn ...
- Python基础之基本数据类型的总结
基本数据类型的总结 1. 按照存储空间的占用分(从低到高) 数字 字符串 集合:无序,即无序存索引相关信息 元组:有序,需要存索引相关信息,不可变 列表:有序,需要存索引相关信息,可变,需要处理数据的 ...