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使用Tkinter显示网络图片的方法
Apr 24 Python
详解Django框架中的视图级缓存
Jul 23 Python
python getopt详解及简单实例
Dec 30 Python
python删除服务器文件代码示例
Feb 09 Python
python实现简易通讯录修改版
Mar 13 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
python与字符编码问题
May 24 Python
python安装numpy和pandas的方法步骤
May 27 Python
用python3读取python2的pickle数据方式
Dec 25 Python
Django密码存储策略分析
Jan 09 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
为你总结一些php系统类函数
2015/10/21 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
js word表格动态添加代码
2010/06/07 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Python 获取项目根路径的代码
2019/09/27 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
会计专业毕业生自我鉴定
2013/10/29 职场文书
百度吧主申请感言
2014/01/12 职场文书
继承公证书
2014/04/09 职场文书
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS