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 相关文章推荐
Pandas中把dataframe转成array的方法
Apr 13 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
python中树与树的表示知识点总结
Sep 14 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
python递归函数用法详解
Oct 26 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
使用Python对SQLite数据库操作
2017/04/06 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python3 max()函数基础用法
2019/02/19 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
几个Shell Script面试题
2014/04/18 面试题
计算机专业求职信
2014/06/02 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js