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