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 相关文章推荐
Python工程师面试题 与Python基础语法相关
Jan 14 Python
python开发之list操作实例分析
Feb 22 Python
python中函数默认值使用注意点详解
Jun 01 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
python 系统调用的实例详解
Jul 11 Python
python样条插值的实现代码
Dec 17 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
Python 发送邮件方法总结
Aug 10 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
Opencv中cv2.floodFill算法的使用
Jun 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
咖啡的传说和历史
2021/03/03 新手入门
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
《Python学习手册》学习总结
2018/01/17 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
python多维数组分位数的求取方式
2020/03/03 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
什么是URL
2015/12/13 面试题
大学生最常用的自我评价
2013/12/07 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
关于工作经历的证明书
2014/10/11 职场文书
初中数学教学随笔
2015/08/15 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书