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 __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
python中PIL安装简单教程
Apr 21 Python
Python实现进程同步和通信的方法
Jan 02 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
python高阶爬虫实战分析
Jul 29 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
python禁用键鼠与提权代码实例
Aug 16 Python
python加载自定义词典实例
Dec 06 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
Python list和str互转的实现示例
Nov 16 Python
Python中对象的比较操作==和is区别详析
Feb 12 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获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
js tab 选项卡
2009/04/26 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
python opencv实现运动检测
2018/07/10 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
公司培训心得体会
2014/01/03 职场文书
大学生水果店创业计划书
2014/01/28 职场文书
求职信范文怎么写
2014/01/29 职场文书
大学生活动策划方案
2014/02/10 职场文书
节电标语大全
2014/06/23 职场文书
好的促销活动方案
2014/08/21 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
上课不认真检讨书
2014/09/17 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
JS ES6异步解决方案
2021/04/29 Javascript
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL