Python中多线程的创建及基本调用方法


Posted in Python onJuly 08, 2016

1. 多线程的作用
简而言之,多线程是并行处理相互独立的子任务,从而大幅度提高整个任务的效率。

2. Python中的多线程相关模块和方法
Python中提供几个用于多线程编程的模块,包括thread,threading和Queue等
thread模块提供了基本的线程和锁的支持,除产生线程外,也提供基本的同步数据结构锁对象,其中包括:
start_new_thread(function, args kwargs=None)  产生一个新的线程来运行给定函数
allocate_lock()  分配一个LockType类型的锁对象
exit() 让线程退出
acquire(wait=None) 尝试获取锁对象
locked()  如果获取了锁对象返回TRUE,否则返回FALSE
release()  释放锁
threading提供了更高级别,功能更强的线程管理功能
Thread类 表示一个线程的执行的对象
Lock 锁原语对象
RLock 可重入锁对象,使单线程可以再次获得已经获取锁
queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构
可用于进程间的通讯,让各个线程之间共享数据
模块函数queue(size)  创建一个大小为size的Queue对象
queue对象函数 qsize()  返回队列大小
empty()  队列为空返回True,否则返回False
put(item, block=0)  把ITEM放到队列中,block不为0,函数会一直阻塞到队列中
get(block=0) 从队列中取一个对象,若果给block,函数会一直阻塞到队列中有对象为止

3.示例
目前Python的lib中对多线程编程提供两种启动方法,一种是比较基本的thread模块中start_new_thread方法,在线程中运行一个函数, 另一种是使用集成threading模块的线程对象Thread类。
目前所用到的,是旧版本中调用thread模块中的start_new_thread()函数来产生新的线程
相比而言,thread.start_new_thread(function,(args[,kwargs]))实现机制其实与C更为类似,其中function参数是将要调用的线程函数;(args[,kwargs])是将传递给待创建线程函数的参数组成的元组类型,其中kwargs是可选的参数。新创建的线程结束一般依靠线程函数的执行结束自动退出,或者在线程函数中调用thread.exit()抛出SystemExit exception,达到线程退出的目的。

print "=======================thread.start_new_thread启动线程============="  
import thread  
#Python的线程sleep方法并不是在thread模块中,反而是在time模块下  
import time  
def inthread(no,interval):  
  count=0  
  while count<10:  
    print "Thread-%d,休眠间隔:%d,current Time:%s"%(no,interval,time.ctime())  
    #使当前线程休眠指定时间,interval为浮点型的秒数,不同于Java中的整形毫秒数  
    time.sleep(interval)  
    #Python不像大多数高级语言一样支持++操作符,只能用+=实现  
    count+=1  
  else:  
    print "Thread-%d is over"%no  
    #可以等待线程被PVM回收,或主动调用exit或exit_thread方法结束线程  
    thread.exit_thread()  
#使用start_new_thread函数可以简单的启动一个线程,第一个参数指定线程中执行的函数,第二个参数为元组型的传递给指定函数的参数值  
thread.start_new_thread(inthread,(1,2))  
  #线程执行时必须添加这一行,并且sleep的时间必须足够使线程结束,如本例  
  #如果休眠时间改为20,将可能会抛出异常  
time.sleep(30)  
'''

使用这种方法启动线程时,有可能出现异常

Unhandled exception in thread started by 
Error in sys.excepthook: 
Original exception was:

解决:启动线程之后,须确保主线程等待所有子线程返回结果后再退出,如果主线程比子线程早结束,无论其子线程是否是后台线程,都将会中断,抛出这个异常
若没有响应阻塞等待,为避免主线程提前退出,必须调用time.sleep使主线程休眠足够长的时间,另外也可以采用加锁机制来避免类似情况,通过在启动线程的时候,给每个线程都加了一把锁,直到线程运行介绍,再释放这个锁。同时在Python的main线程中用一个while循环来不停的判断每个线程锁已释放。

import thread;  
from time import sleep,ctime;  
from random import choice  
#The first param means the thread number  
#The second param means how long it sleep  
#The third param means the Lock  
def loop(nloop,sec,lock):  
  print "Thread ",nloop," start and will sleep ",sec;  
  sleep(sec);  
  print "Thread ",nloop," end ",sec;  
  lock.release();  
  
def main():  
  seconds=[4,2];  
  locks=[];  
  for i in range(len(seconds)) :  
    lock=thread.allocate_lock();  
    lock.acquire();  
    locks.append(lock);  
      
  print "main Thread begins:",ctime();  
  for i,lock in enumerate(locks):  
    thread.start_new_thread(loop,(i,choice(seconds),lock));  
  for lock in locks :  
    while lock.locked() :   
      pass;  
  print "main Thread ends:",ctime();  
  
if __name__=="__main__" :  
  main();

很多介绍说在新python版本中推荐使用Threading模块,目前暂没有应用到。。。

Python 相关文章推荐
Python中的ConfigParser模块使用详解
May 04 Python
python实现读取命令行参数的方法
May 22 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
Python中实现输入一个整数的案例
May 03 Python
Python接口测试文件上传实例解析
May 22 Python
Pytorch 如何加速Dataloader提升数据读取速度
May 28 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 #Python
Python遍历目录中的所有文件的方法
Jul 08 #Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 #Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 #Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 #Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 #Python
Python中的os.path路径模块中的操作方法总结
Jul 07 #Python
You might like
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
十天学会php(2)
2006/10/09 PHP
Content-type 的说明
2006/10/09 PHP
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python3学习笔记之列表方法示例详解
2017/10/06 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python设置环境变量的原因和方法
2019/06/24 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
软件测试面试题
2015/10/21 面试题
写自荐信的注意事项
2014/03/09 职场文书
代理人委托书
2014/09/16 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书