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 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python实现聊天小程序
Mar 13 Python
Python实现的计算器功能示例
Apr 26 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
scrapy头部修改的方法详解
Dec 06 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
python munch库的使用解析
May 25 Python
Python面试不修改数组找出重复的数字
May 20 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
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
简单JS代码压缩器
2006/10/12 Javascript
javascript中length属性的探索
2011/07/31 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
Python3中的json模块使用详解
2018/05/05 Python
PyTorch预训练的实现
2019/09/18 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
法律七进实施方案
2014/03/15 职场文书
公司经理聘任书
2014/03/29 职场文书
安全责任协议书
2014/04/21 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
怎样写离婚协议书
2014/09/10 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
Django中celery的使用项目实例
2022/07/07 Python