python多线程编程中的join函数使用心得


Posted in Python onSeptember 02, 2014

今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛。恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成。没有时间没有精神没有力气学习了,这篇博客就说说python中一个小小函数。

由于坑爹的学校坑爷的专业,多线程编程老师从来没教过,多线程的概念也是教的稀里糊涂,本人python也是菜鸟级别,所以遇到多线程的编程就傻眼了,别人用的顺手的join函数我却偏偏理解不来。早上在去辛集的路上想这个问题想到恶心,回来后继续写代码测试,终于有些理解了(python官方的英文解释理解不了,网友的解释也不够详细,只能自己钻)。
测试用的代码如下:

# coding: utf-8
# 测试多线程中join的功能
import threading, time  

def doWaiting():  

    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"  

    time.sleep(3)  

    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" 

def doWaiting1():  

    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"   

    time.sleep(8)  

    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"  

tsk = []    

thread1 = threading.Thread(target = doWaiting)  

thread1.start()  

tsk.append(thread1)

thread2 = threading.Thread(target = doWaiting1)  

thread2.start()  

tsk.append(thread2)

print 'start join: ' + time.strftime('%H:%M:%S') + "\n"   

for tt in tsk:

    tt.join()

print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

这个小程序使用了两个线程thread1和thread2,线程执行的动作分别是doWaiting()和doWaiting1(),函数体就是打印「开始」+休眠3秒+打印「结束」,分别附加上时间用来查看程序执行的过程。后面用start()方法同步开始执行两个线程。然后开始循环调用两个线程的join()方法,在此之前和之后都会用print函数做好开始结束的标记。我们主要观察for tt in tsk: tt.join()。

join()不带参数的情况下,执行如下:

python多线程编程中的join函数使用心得

可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。

下面把参数设置成超时2s,即tt.join(2),执行如下:

python多线程编程中的join函数使用心得

两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。

总结一下:

1.join方法的作用是阻塞主进程(挡住,无法执行join以后的语句),专注执行多线程。

2.多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。

3.无参数,则等待到该线程结束,才开始执行下一个线程的join。

4.设置参数后,则等待该线程这么长时间就不管它了(而该线程并没有结束)。不管的意思就是可以执行后面的主进程了。

最后附上参数为2时的程序执行流程表,自己画的orz,这样看起来更好理解。

python多线程编程中的join函数使用心得

Python 相关文章推荐
tensorflow输出权重值和偏差的方法
Feb 10 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
便捷提取python导入包的属性方法
Oct 15 Python
python 实现识别图片上的数字
Jul 30 Python
Python 中@property的用法详解
Jan 15 Python
Django操作session 的方法
Mar 09 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python3+Flask安装使用教程详解
Feb 16 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
Python中with上下文管理协议的作用及用法
Mar 18 Python
python中的函数用法入门教程
Sep 02 #Python
python爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 #Python
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 #Python
python批量同步web服务器代码核心程序
Sep 01 #Python
寻找网站后台地址的python脚本
Sep 01 #Python
python批量修改文件名的实现代码
Sep 01 #Python
python中List的sort方法指南
Sep 01 #Python
You might like
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
实例解析Array和String方法
2016/12/14 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
几行js代码实现自适应
2017/02/24 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
微信小程序删除处理详解
2017/08/16 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
Javascript Web Worker使用过程解析
2020/03/16 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python模拟Django框架实例
2016/05/17 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python针对excel的操作技巧
2018/03/13 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
中英文求职信范文
2014/01/27 职场文书
中介业务员岗位职责
2014/04/09 职场文书
物流专业求职信
2014/06/30 职场文书
委托证明模板
2014/09/16 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书