多线程技术

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(多线程技术)的更多相关文章

  1. Selenium 2自动化测试实战

    Selenium 2自动化测试实战 百度网盘 链接:https://pan.baidu.com/s/1aiP3d8Y1QlcHD3fAlEj4sg 提取码:jp8e 复制这段内容后打开百度网盘手机Ap ...

  2. Selenium 2自动化测试实战3(函数、类和方法)

    一.函数.类和方法1.函数在python中通过def关键字来定义函数 创建一个add()函数,此函数接收两个参数a,b,通过print()打印a+b的结果.调用add()函数,并且上传两个参数3,5给 ...

  3. 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法

    虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...

  4. Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

    背景 最近在弄 appium,然后顺便发现了 Selenium 框架和这本书,恰好这本书也介绍了一些软件测试&自动化测试的理论知识,遂拿过来学习学习.所以本文几乎没有实践内容,大多都是概念和工 ...

  5. Selenium 2自动化测试实战18(上传文件)

    一.上传文件 上传文件是比较常见的web功能之一,但WebDriver没有提供专门用于上传的方法. 一般web页面的上传功能的操作需要单击“上传”按钮后打开本地的Window窗口,从窗口选择本地文件进 ...

  6. Selenium+Python自动化测试实战(2)元素定位

    1.Selenium2 的原理 第一篇分享简单介绍了基于Python开发的Selenium2的环境配置,这篇主要讲一下基本用法.首先讲一下Selenium2的基本原理.基本上知道了这个东西是怎么回事, ...

  7. Selenium 2自动化测试实战39(Page Object设计模式)

    Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...

  8. Selenium 2自动化测试实战35(HTML测试报告)

    HTML测试报告 显然,一份漂亮的测试报告展示自动化测试成果只有一个简单的log文件是不够的.HTMLTestRunner是python标准库unittest单元测试框架的一个扩展,它生成易于使用的H ...

  9. Selenium 2自动化测试实战34(编写Web测试用例)

    编写Web测试用例 1.介绍了unittest单元测试框架,其主要是来运行Web自动化测试脚本.简单的规划一下测试目录:web_demo1/------test_case/------------te ...

随机推荐

  1. 前端基础(五):jQuery

    jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交互, ...

  2. 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

    面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...

  3. web开发:css总结与应用

    一.常用标签的使用 二.边界圆角 三.背景样式 四.精灵图 五.盒模型布局细节 六.盒模型案例 七.w3c主页 一.常用标签的使用 <!DOCTYPE html> <html> ...

  4. 4.caffe:train_val.prototxt、 solver.prototxt 、 deploy.prototxt( 创建模型与编写配置文件)

    一,train_val.prototxt name: "CIFAR10_quick" layer { name: "cifar" type: "Dat ...

  5. Python将HTML转换为PDF

    Python将HTML转换为PDF 使用pdfkit库和wkhtmltopdf, pip install pdfkit wkhtmltopdflinux中一般需要添加sudo权限. Windows安装 ...

  6. mybatis详解(三)

    一,动态sql,where,trim,set和foreach parameterType的属性可以不用写 xml文件sql的书写 <select id="queryByParams&q ...

  7. switch结构

    switch结构介绍 switch也属于条件判断的语句 支持多种写法,和if .. else if ...else 结构的功能类似,但是里面的细节需要注意的地方更多 switch基本语法 switch ...

  8. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  9. 《Redis 设计与实现》读书笔记(二)

    单机数据库实现 九.数据库 1.服务器中的数据库 一个redis服务器保存多个数据库. struct redisServer { //一个数组,多个数据库 redisDb *db; } 当执行sele ...

  10. python--openCV--视频处理

    编码格式 视频容器中,一般有视频和音频数据,它们采取的编码方式不一样. 视频常见的编码方式通常有: x264.h264.mpeg-4 音频常见的编码方式通常有: mp3.AAC.flac 编码的目的主 ...