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  __getattr__与__setattr__使用方法
Sep 06 Python
Python实现的简单算术游戏实例
May 26 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python命令行工具Click快速掌握
Jul 04 Python
详解python中__name__的意义以及作用
Aug 07 Python
使用Python的turtle模块画国旗
Sep 24 Python
Tensorflow的梯度异步更新示例
Jan 23 Python
学会python自动收发邮件 代替你问候女友
May 20 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
服务器web工具 php环境下
2010/12/29 PHP
php 购物车完整实现代码
2014/06/05 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
php自动加载方式集合
2016/04/04 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
asp 取文本框名称代码
2008/12/02 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
python自动发微信监控报警
2019/09/06 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
运动会通讯稿500字
2014/02/20 职场文书
本科毕业生自荐信
2014/06/02 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
python之json文件转xml文件案例讲解
2021/08/07 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS