Selenium2 Python 自动化测试实战学习笔记(八)

本文介绍了Python中的多线程技术,包括threading模块的使用,优化线程创建,以及如何应用于自动化测试,特别是Selenium Grid2的分布式测试。通过实例展示了如何在测试项目中实现多进程执行测试用例。
摘要由CSDN通过智能技术生成

Python 多线程

分布式和并行是完全不同的概念,分布式只负责将一个测试脚本可调用不同的远程环境来执行;并行强调“同时”的概念,它可以借助多线程或多进程技术并行来执行脚本技术。


10.1 单进程的时代


         在单线程的时代,当处理器要处理多个任务时,必须要对这些任务排一下执行顺序并按照这个顺序来执行任务。假如我们创建了两个任务,听音乐(music)和看电影(move),在单线程中我们只能按先后顺序来执行这两个任务。

Onethread.py

#coding=utf-8
from time import sleep, ctime
 
def music():
   print 'I was listening to music! %s' %ctime()
   sleep(2)
 
def move():
   print 'I was at the movies! %s' %ctime()
   sleep(5)
   
if __name__ == '__main__':
   music()
   move()
print 'allend:', ctime()

         别创建了两个任务music 和move,执行music 需要2 秒,执行move 需要5 秒,通过sleep()

方法设置休眠时间来模拟任务的运行时间。

    给music() 和move()两个方法设置参数,用于接收要播放的歌曲和视频,通过for 循环控制播放的次数,分别让歌曲和电影播放了2 次:onethread_with_pri.py:

#coding=utf-8
from time import sleep, ctime
 
def music(func):
    for i in range(2):
        print 'I was listening to music %s! %s'%(func,ctime())
        sleep(2)
 
def move(func):
     for i in range(2):
        print 'I was at the movies %s! %s'%(func,ctime())
        sleep(5)
   
if __name__ == '__main__':
    music(u'爱情买卖')
    move(u'阿凡达')
print 'all end:', ctime()


10.2 多线程技术


         Python 通过两个标准库thread和threading 提供对线程的支持。thread 提供了低级别的、原始的线程以及一个简单的锁。threading 基于Java 的线程模型设计。锁(Lock)和条件变量(Condition)在Java中是对象的基本行为(每一个对象都自带了锁和条件变量),而在Python 中则是独立的对象。


   10.2.1 threading 模块


         避免使用thread 模块,因为是它不支持守护线程。当主线程退出时,所有的子线程不论它

们是否还在工作,都会被强行退出。threading模块则支持守护线程。Threads.py:

#coding=utf-8
from time import sleep, ctime
import threading
 
def music(func):
   for i in range(2):
        print 'I was listening to music %s! %s'%(func,ctime())
        sleep(2)
 
def move(func):
    for i in range(2):
        print 'I was at the movies %s! %s'%(func,ctime())
        sleep(5)
 
threads=[]
t1=threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1)
t2=threading.Thread(target=move,args=(u'阿凡达',))
threads.append(t2)
   
if __name__ == '__main__':
   for i in threads:
        i.start()
   #keep thread
   for i in threads:
        i.join()
       
print 'all end:', ctime()

import threading 引入线程模块。

threads = [] 创建线程数组,用于装载线程。

threading.Thread()通过调用threading模块的Thread()方法来创建线程。

start() 开始线程活动。

join() 等待线程终止。

通过for 循环遍历thread 数组中所装载的线程;然后通过start()函数启动每一个线程。

join()会等到线程结束,或者在给了timeout 参数的时候,等到超时为止。join()的另一个比较重要的方面是它可以完全不用调用。一旦线程启动后,就会一直运行,直到线程的函数结束,退出为止。


  10.2.2 优化线程的创建

         从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个t(t1、t2、...),如果创建的线程较多时这样极其不方便。Playe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WEL测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值