python多线程编程方式分析示例详解


Posted in Python onDecember 06, 2013

在Python多线程中如何创建一个线程对象

如果你要创建一个线程对象,很简单,只要你的类继承threading.Thread,然后在__init__里首先调用threading.Thread的__init__方法即可

import threading  
class mythread(threading.Thread):  
def __init__(self, threadname):  
threading.Thread.__init__(self, name = threadname) 

这才仅仅是个空线程,我可不是要他拉空车的,他可得给我干点实在活。很简单,重写类的run()方法即可,把你要在线程执行时做的事情都放到里面

import threading  
import time  
class mythread(threading.Thread):  
def __init__(…):  
….  
def run(self):  
for i in range(10):  
print self.getName, i  
time.sleep(1)

以上代码我们让这个线程在执行之后每隔1秒输出一次信息到屏幕,10次后结束
getName()是threading.Thread类的一个方法,用来获得这个线程对象的name。还有一个方法setName()当然就是来设置这个线程对象的name的了。
如果要创建一个线程,首先就要先创建一个线程对象
mythreadmythread1 = mythread('mythread 1′)
一个线程对象被创建后,他就处于“born”(诞生状态)
如何让这个Python多线程对象开始运行呢?只要调用线程对象的start()方法即可
mythread1.start()
现在线程就处于“ready”状态或者也称为“runnable”状态。
奇怪吗?不是已经start了吗?为什么不称为“running”状态呢?其实是有原因的。因为我们的计算机一般是不具有真正并行处理能力的。我们所谓的Python多线程只是把时间分成片段,然后隔一个时间段就让一个线程执行一下,然后进入“sleeping ”状态,然后唤醒另一个在“sleeping”的线程,如此循环runnable->sleeping->runnable… ,只是因为计算机执行速度很快,而时间片段间隔很小,我们感受不到,以为是同时进行的。所以说一个线程在start了之后只是处在了可以运行的状态,他什么时候运行还是由系统来进行调度的。
那一个线程什么时候会“dead”呢?一般来说当线程对象的run方法执行结束或者在执行中抛出异常的话,那么这个线程就会结束了。系统会自动对“dead”状态线程进行清理。
如果一个线程t1在执行的过程中需要等待另一个线程t2执行结束后才能运行的话那就可以在t1在调用t2的join()方法

def t1(…):  
…  
t2.join() 

这样t1在执行到t2.join()语句后就会等待t2结束后才会继续运行。
但是假如t1是个死循环的话那么等待就没有意义了,那怎么办呢?可以在调用t2的join()方法的时候给一个浮点数做超时参数,这样这个线程就不会等到花儿也谢了了。我等你10s,你不回来我还不允许我改嫁啊?

def t1(…):  
…  
t2.join(10) 

如果一个进程的主线程运行完毕而子线程还在执行的话,那么进程就不会退出,直到所有子线程结束为止,如何让主线程结束的时候其他子线程也乖乖的跟老大撤退呢?那就要把那些不听话的人设置为听话的小弟,使用线程对象的setDaemon()方法,参数为bool型。True的话就代表你要听话,我老大(主线程)扯呼,你也要跟着撤,不能拖后腿。如果是False的话就不用那么听话了,老大允许你们将在外军命有所不受的。需要注意的是setDaemon()方法必须在线程对象没有调用start()方法之前调用,否则没效果。

t1 = mythread('t1′)  
print t1.getName(),t1.isDaemon()  
t1.setDaemon(True)  
print t1.getName(),t1.isDaemon()  
t1.start()  
print ‘main thread exit'

当执行到 print 'main thread exit'后,主线程就退出了,当然t1这个线程也跟着结束了。但是如果不使用t1线程对象的setDaemon()方法的话,即便主线程结束了,还要等待t1线程自己结束才能退出进程。isDaemon()是用来获得一个线程对象的Daemonflag状态的。

如何来获得与Python多线程有关的信息呢?

获得当前正在运行的线程的引用
running = threading.currentThread()

获得当前所有活动对象(即run方法开始但是未终止的任何线程)的一个列表
threadlist = threading.enumerate()

获得这个列表的长度
threadcount = threading.activeCount()
查看一个线程对象的状态调用这个线程对象的isAlive()方法,返回1代表处于"runnable"状态且没有"dead"

threadflag = threading.isAlive()

Python 相关文章推荐
Python实现基本数据结构中栈的操作示例
Dec 04 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
python计算列表内各元素的个数实例
Jun 29 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
python3安装crypto出错及解决方法
Jul 30 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 Python
树莓派中python获取GY-85九轴模块信息示例
Dec 05 #Python
python线程锁(thread)学习示例
Dec 04 #Python
pyv8学习python和javascript变量进行交互
Dec 04 #Python
python使用PyV8执行javascript代码示例分享
Dec 04 #Python
python解析xml文件实例分享
Dec 04 #Python
python抓取某汽车网数据解析html存入excel示例
Dec 04 #Python
python共享引用(多个变量引用)示例代码
Dec 04 #Python
You might like
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
工厂会计员职责
2014/02/06 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
天鹅湖观后感
2015/06/09 职场文书
小学生读书笔记范文
2015/06/30 职场文书
食品安全主题班会
2015/08/13 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis