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更新数据库脚本两种方法及对比介绍
Jul 27 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
Python拼接字符串的7种方法总结
Nov 01 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
关于Python错误重试方法总结
Jan 03 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
快速一键生成Python爬虫请求头
Mar 04 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
php中的比较运算符详解
2013/10/28 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
Ionic快速安装教程
2016/06/03 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
教你用Python写安卓游戏外挂
2018/01/11 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
python selenium循环登陆网站的实现
2019/11/04 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
通过python检测字符串的字母
2020/02/18 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
会计岗位职责范本
2014/03/07 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
主持稿开场白
2015/06/01 职场文书
母亲去世追悼词
2015/06/23 职场文书
中秋节祝酒词
2015/08/12 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
win sever 2022如何占用操作主机角色
2022/06/25 Servers
python高温预警数据获取实例
2022/07/23 Python
基于Redission的分布式锁实战
2022/08/14 Redis