多线程技术

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. 轻量化模型之MobileNet系列

    自 2012 年 AlexNet 以来,卷积神经网络在图像分类.目标检测.语义分割等领域获得广泛应用.随着性能要求越来越高,AlexNet 已经无法满足大家的需求,于是乎各路大牛纷纷提出性能更优越的 ...

  2. Centos7.4下安装Python3

    安装Python3 安装依赖包 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-de ...

  3. SSH环境搭建之Hibernate环境搭建篇

    SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...

  4. Windows&Appium&Python自动化测试-环境搭建之安卓SDK

    一.摘要 本博文将详细讲述在Windows环境下的jdk安装.配置以及环境校验:安卓sdk安装.配置以及环境校验 二.安装包工具准备: jdk1.8.0(64 位) installer_r24.4.1 ...

  5. golang docker kubernetes

    不断共建Golang生态.其中比较有代表性的Golang编写软件作品是Docker和Kubernetes.从目前Golang的发展时间和社区活跃度来看,Golang无疑是一门成功的编程语言.

  6. p4434 [COCI2017-2018#2] ​​Usmjeri

    思路 并查集的好题 考虑到求满足条件限制的方案数,显然观察样例可知结果就是2^x,x是互不影响的边的集合数量 然后考虑如何求互不影响的边的集合数量 可以使用并查集,用i和i+n表示这个点的父亲连向它的 ...

  7. 零基础免费搭建个人博客-hexo+github

    使用hexo生成静态博客并架设在免费的github page平台 准备 系统: Window 7 64位 使用软件: Git v1.9.5[下载地址] 百度云 360云盘 访问密码 d269 Git官 ...

  8. unity里framebuffer fetch相关问题

    https://docs.unity3d.com/Manual/SL-PlatformDifferences.html 开了framebuffer fetch 如果你再在里面sample 那张rt ( ...

  9. NPM酷库:jsdom,纯JS实现的DOM

    NPM酷库,每天两分钟,了解一个流行NPM库. 昨天认识了一个在Node.js环境下操作HTML的库 cheerio,cheerio实现了jQuery接口,用起来十分方便.为什么不直接用jQuery呢 ...

  10. fsLayuiPlugin单页面操作

    概述 单页面处理新增.修改.查看详情 共用同一个弹出的页面.在线demo数据表格2 使用 提供2种处理方式(主要区别区弹出窗口的html配置),根据实际情况选择使用那种方式. 新增.修改功能共用一个按 ...