文档章节

python - threading 多线程 setDaemon 和 join 的区别

big_cat
 big_cat
发布于 2016/05/18 13:13
字数 782
阅读 3.8K
收藏 4

行业解决方案、产品招募中!想赚钱就来传!>>>

#! /usr/bin/env python
"""
python 多线程的管理机制
"""
__author__ = 'sallency'

import threading
import time

#封装一个线程包的类
class MyThread(threading.Thread):

    def __init__(self, name, count, interval):
        threading.Thread.__init__(self)
        self.name = name
        self.count = count
        self.interval = interval
        self.stop = False

    def run(self):
        while not self.stop:
            print "thread: %s count %d time %s" % (self.name, self.count, time.ctime())
            time.sleep(self.interval)
            self.count += 1

    def stop(self):
        self.stop = True
#任务
def task():
    thr_1 = MyThread('thread_1', 10, 3)
    thr_2 = MyThread('thread_2', 5, 3)
    #如果这里设为true的话 则主线程执行完毕后会将子线程回收掉
    #默认是 false 则主进程执行结束时不会回收子线程
    thr_1.setDaemon(True)
    thr_2.setDaemon(True)
    thr_1.start()
    thr_2.start()
    #join则是阻塞主线程 让其在子线程执行完毕后方可继续执行
    #这就保证了当主线程执行完毕前,所有的子线程一定执行完毕了
    #thr_1.join()
    #thr_2.join()
    return True

if __name__ == "__main__":
    print "main threading start: %s" % (time.ctime())
    task()
    print "main threading end: %s" % (time.ctime())

python 可以方便的使用 threading 包来实现多线程

线程对象有两个用来管理线程机制的方法: setDaemon 和 join

     主线程启动若干个子线程后,可以继续执行主线程的代码,也可以等待所有的子线程执行完毕后继续执行主线程,这里需要用到的就是 join 方法,子线程通过调用 join 可以告诉主线程,你必须等着我,我完事了你才可以再往下执行。

     这里要理解,比如 子线程1 花费 10秒,子线程2 花费 5秒,如果子线程 2 调用了 join,那么 主线程只会等待用时 5秒 的子线程2 执行完毕,会继续向下执行,而不会等待还需要5秒才能执行完毕的子线程1

    所以如果需要所有的子线程都能在主线程结束前被执行完毕,则必须为每一个子线程都注册 join

    如果没有为子线程注册 join,则可能会出现在主线程执行完毕之前,还有很多子线程没有执行完毕,这时如果你为子线程注册了 setDaemon(True) 的话,主线程会回收此子线程;否则,主线程就不管他了,自己结束了,子线程依旧在那执行。默认是 False,也就说主线程不会回收子线程

setDaemon

    setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;设为True相当于像主线程中注册守护,主线程结束时会将其一并回收

join

    join(): 设置主线程是否同步阻塞自己来待此线程执行完毕。如果不设置的话则主进程会继续执行自己的,在结束时根据 setDaemon 有无注册为守护模式的子进程,有的话将其回收,没有的话就结束自己,某些子线程可以仍在执行

big_cat
粉丝 51
博文 244
码字总数 165998
作品 0
长宁
后端工程师
私信 提问
加载中
此博客有 1 条评论,请先登录后再查看。
Password Manager Daemon

pwmd(Password Manager Daemon) 通过 Unix domain socket 提供服务,数据存储在加密的 XML 文件中,客户端必须提供密钥才能修改。支持多线程,可同时允许多个客户端同时连接。 特性 通过 ...

匿名
2013/03/12
425
0
OSX游戏模拟器--Open Emu

OpenEmu 是一项开源计划,目的是将游戏模拟带入OS X,使用Cocoa、Core Animation和Quartz等现代OS X技术,使用Sparkle进行自动升级。 Open Emu使用模块化构架,支持游戏引擎插件,这意味着O...

匿名
2013/04/10
1.6W
3
Python开发者社区整站源码--Pythoner

pythoner.net 整站源代码 依赖模块 Django 1.4.2 PIL DjangoVerifyCode 0.2.2 开发环境配置 运行scripts目录下的setupenv.sh文件,将会自动安装配置所需环境 设置本地环境变量:export env=D...

~T.y~
2013/04/10
3.1K
0
阿里云开放存储服务的C语言SDK--OSSC

OSSC(Aliyun Open Storage Service C SDK)为阿里云开放存储服务(OSS)提供了一套完整易用的C SDK。 OSSC完全采用C语言开发,并实现了类似面向对象的调用方式,遵循了良好的编码规范,目前O...

大卷卷
2012/10/22
4.5K
0
Python数据分析工具包--Pandas

Python Data Analysis Library 或 pandas 是连接 SciPy 和 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集...

匿名
2012/10/30
2.1W
2

没有更多内容

加载失败,请刷新页面

加载更多

认识Node

什么是Node? Node 是 JavaScript 的一种运行环境。可以使 JS 代码不依赖浏览器也可以执行。他俩的差异如下: 两个运行环境都包含了 ECMScript 。另一方面 JavaScript 包含了 BOM 和 DOM。 ...

长臂猿猴
14分钟前
13
0
正则表达式中的非捕获组是什么? - What is a non-capturing group in regular expressions?

问题: 非捕获组(即(?:) )如何在正则表达式中使用,它们有什么用? 解决方案: 参考一: https://stackoom.com/question/Ejkl/正则表达式中的非捕获组是什么 参考二: https://oldbug.net...

技术盛宴
14分钟前
6
0
他在国外演讲时说,学Python只要看答案做完这几十道题,就足够了

你想学Python?其实很简单,因为Python本身就是一门比较简单的编程语言。 你要做的也就是看着答案做完这几十道题就可以了,不管你是不是有编程基础,因为答案摆在那儿,你不可能不会做。 为什...

python小天
14分钟前
0
0
「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制

0 复习 代理模式 代理模式,可以为目标类添加额外功能。 Spring 动态代理 定义目标类对象 定义额外功能,增强。实现Spring内置的接口 配置增强类 定义切入点 编织组装 增强类型 前置增强 Me...

鹿老师的Java笔记
34分钟前
21
0
OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
51分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部