Python THREADING模块中的JOIN()方法深入理解


Posted in Python onFebruary 18, 2015

看了oschina上的两个代码,受益匪浅。其中对join()方法不理解,看python官网文档的介绍:
join([timeout]):等待直到进程结束。这将阻塞正在调用的线程,直到被调用join()方法的线程结束。(好难翻译,应该是这个意思)

哈哈,这个易懂。
join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法。

#-*- encoding: gb2312 -*-

import string, threading, time

 

def thread_main(a):

    global count, mutex

    # 获得线程名

    threadname = threading.currentThread().getName()

 

    for x in xrange(0, int(a)):

        # 取得锁

        mutex.acquire()

        count = count + 1

        # 释放锁

        mutex.release()

        print threadname, x, count

        time.sleep(1)

 

def main(num):

    global count, mutex

    threads = []

 

    count = 1

    # 创建一个锁

    mutex = threading.Lock()

    # 先创建线程对象

    for x in xrange(0, num):

        threads.append(threading.Thread(target=thread_main, args=(10,)))

    # 启动所有线程

    for t in threads:

        t.start()

    # 主线程中等待所有子线程退出

    for t in threads:

        t.join()  

 

if __name__ == '__main__':

    num = 4

    # 创建4个线程

    main(4)

###################################################################

#-*- encoding: gb2312 -*-

import threading

import time

 

class Test(threading.Thread):

    def __init__(self, num):

        threading.Thread.__init__(self)

        self._run_num = num

 

    def run(self):

        global count, mutex

        threadname = threading.currentThread().getName()

 

        for x in xrange(0, int(self._run_num)):

            mutex.acquire()

            count = count + 1

            mutex.release()

            print threadname, x, count

            time.sleep(1)

 

if __name__ == '__main__':

    global count, mutex

    threads = []

    num = 4

    count = 1

    # 创建锁

    mutex = threading.Lock()

    # 创建线程对象

    for x in xrange(0, num):

        threads.append(Test(10))

    # 启动线程

    for t in threads:

        t.start()

    # 等待子线程结束

    for t in threads:

        t.join()

在程序中,最后join()方法的调用就明白了,是主进程挨个调用子线程的join()方法。当四个线程都执行完毕后,主线程才会执行下面的代码,在这里也就是退出了。
相对应的在网上一起找到的另一个方法:
3.守护进程

setDaemon()

这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法啦

Python 相关文章推荐
Python编码爬坑指南(必看)
Jun 10 Python
python 文件操作删除某行的实例
Sep 04 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
python hook监听事件详解
Oct 25 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
Python实现视频中添加音频工具详解
Dec 06 Python
python持久性管理pickle模块详细介绍
Feb 18 #Python
Python中暂存上传图片的方法
Feb 18 #Python
Python中AND、OR的一个使用小技巧
Feb 18 #Python
Python编写屏幕截图程序方法
Feb 18 #Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 #Python
Python内置函数Type()函数一个有趣的用法
Feb 18 #Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 #Python
You might like
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
浅析Python的Django框架中的Memcached
2015/07/23 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
关于python字符串方法分类详解
2019/08/20 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
Python字典实现伪切片功能
2020/10/28 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
中海讯通笔试题
2015/09/15 面试题
StringBuilder和String的区别
2015/05/18 面试题
中专生职业生涯规划书范文
2013/12/29 职场文书
西式婚礼证婚词
2014/01/12 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers