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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
python 杀死自身进程的实现方法
Jul 01 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
python元组的概念知识点
Nov 19 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
浅谈Python中的继承
Jun 19 Python
Python自动化操作实现图例绘制
Jul 09 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php二维数组转成字符串示例
2014/02/17 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
PHP7 新增功能
2021/03/09 PHP
JavaScript中对象介绍
2014/12/31 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
简述vue中的config配置
2018/01/23 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
Python pickle模块用法实例
2015/04/14 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python实现的希尔排序算法实例
2015/07/01 Python
Python实现通讯录功能
2018/02/22 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
python 通过文件夹导入包的操作
2020/06/01 Python
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
最常使用的求职信
2014/05/25 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
优秀党员事迹材料
2014/12/18 职场文书
考试没考好检讨书
2015/05/06 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
MySQL分区路径子分区再分区
2022/04/13 MySQL
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang