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中数字以及算数运算符的相关使用
Oct 12 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
python实现求特征选择的信息增益
Dec 18 Python
详解Python中pandas的安装操作说明(傻瓜版)
Apr 08 Python
python中的&amp;&amp;及||的实现示例
Aug 07 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
Python字典dict常用方法函数实例
Nov 09 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
python缺失值填充方法示例代码
Dec 24 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
PHP网站备份程序代码分享
2011/06/10 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
在python中pandas的series合并方法
2018/11/12 Python
Python检查ping终端的方法
2019/01/26 Python
pandas中的series数据类型详解
2019/07/06 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
有关爱国演讲稿
2014/05/07 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
标枪加油稿
2015/07/22 职场文书