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聊天室程序(基础版)
Apr 01 Python
基于Django与ajax之间的json传输方法
May 29 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
python gdal安装与简单使用
Aug 01 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
Python中的面向接口编程示例详解
Jan 17 Python
Django如何创作一个简单的最小程序
May 12 Python
python字符串的一些常见实用操作
Apr 06 Python
Python图像处理库PIL详细使用说明
Apr 06 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 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
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP实现简易blog的制作
2016/10/24 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
PHP attributes()函数讲解
2019/02/03 PHP
PHP中SESSION过期设置
2021/03/09 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
Python3.2模拟实现webqq登录
2016/02/15 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
如何基于python生成list的所有的子集
2019/11/11 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
pymysql模块使用简介与示例
2020/11/17 Python
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
单位作风建设剖析材料
2014/10/11 职场文书
婚礼答谢礼品
2015/01/20 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
Nginx利用Logrotate实现日志分割
2022/05/20 Servers
nginx 配置指令之location使用详解
2022/05/25 Servers