一:什么情况下使用join

join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时。

参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么主调线程将一直阻塞直到被调用线程结束

# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import threading
import time def run(n):
print("threading",n)
time.sleep(2) start_time=time.time()
thread_obj=[] #放线程对象
#起启50个线程,并发执行
for i in range(50):
t=threading.Thread(target=run,args=("t%s" %i, ))
t.start()
thread_obj.append(t) #等待所有线程执行结束
for j in thread_obj: #主线程起动子线程,不会等子线程执行结束,所以要强制使用join等待每子线程执行结束
j.join() print("-----main thread cost time---",time.time()-start_time) #一共花了2秒 """
threading t0
threading t1
threading t2
threading t3
threading t4
threading t5
threading t6
threading t7
threading t8
threading t9
threading t10
threading t11
threading t12
threading t13
threading t14
threading t15
threading t16
threading t17
threading t18
threading t19
threading t20
threading t21
threading t22
threading t23
threading t24
threading t25
threading t26
threading t27
threading t28
threading t29
threading t30
threading t31
threading t32
threading t33
threading t34
threading t35
threading t36
threading t37
threading t38
threading t39
threading t40
threading t41
threading t42
threading t43
threading t44
threading t45
threading t46
threading t47
threading t48
threading t49
-----main thread cost time--- 2.3117313385009766
"""

二:Daemon

       setDaemon()可以参考Python文档说明。大概意思就是可以设置setDaemon的参数为True来表示将该线程指定为守护线程,如果参数为False就不指定线程为守护线程。设置setDaemon的参数为True之后。主线程和子线程会同时运行,主线程结束运行后,无论子线程运行与否,都会和主线程一起结束。

## -*- coding:utf-8 -*-
__author__ = 'shisanjun' import threading
import time def run(n):
print("threading",n,threading.current_thread())
time.sleep(2)
print("threading child") start_time=time.time()
thread_obj=[] #放线程对象
#起启50个线程,并发执行
for i in range(50):
t=threading.Thread(target=run,args=("t%s" %i, ))
t.setDaemon(True)#就是把当前线程为守护线程,必须在start之前
t.start()
thread_obj.append(t)#为了不阻塞后面的线程的启动,不在这里join,先放到一个列表里 # #等待所有线程执行结束
# for j in thread_obj: #主线程起动子线程,不会等子线程执行结束,所以要强制使用join等待每子线程执行结束
# j.join()
#threading.current_thread()检查当前的线程名,可看是不是主线程,threading.active_count()检查活动线程个数
print("-----main thread cost time---",time.time()-start_time,threading.current_thread(),threading.active_count()) """
主线程是主人,子线程仆人,如果没有主人,就没仆人。
不加join时候,主线程不会等子线程结束。加了join主线程依赖子线程结束,主线程默认有一个join
所有子线程变为守护线程,代表子线程变为仆人了,主线程还为等子线程结束嘛?主线程不会等子线程运行结束。主线程可以直接结束
所有子线程变为守护线程,主线程不会等子线程,他会等非守护线程结束。他是仆人不重要
加了t.setDaemon(True)程序不会主线程不会sleep2 例子:主线程和子线程,比做主人和仆人关系
谁是主人,谁是仆人,守护线程就是仆人,守护就是守护主人,主人die,仆人也die,
所以主线程结束了或者退出了,守护线程也会结束,而且不他不用告诉你。所以可以看到print("threading child")并没有输出。如果在主线程加了sleep,可能会看到一些
因为CPU执行速度太快了。
主线程
本来就是非守护线程
"""

三:总结

  1 Python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

  2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

  3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

  4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

  5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

python网络编程--线程join和Daemon(守护进程)的更多相关文章

  1. python网络编程--线程(锁,GIL锁,守护线程)

    1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观 ...

  2. PHP7 网络编程(二)daemon守护进程

    前言 在一个多任务的计算机操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的计算机程序.此类程序会被以进程的形式初始化.守护进程程序的名称通常以字母“ ...

  3. python网络编程--线程锁(互斥锁Mutex)

    一:为什么需要线程锁 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? 很简单,假设你有A,B两 ...

  4. Unix网络编程代码 第13章 守护进程和inetd超级服务器

    1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务.    守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也 ...

  5. python网络编程-线程队列queue

    一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...

  6. python网络编程--线程使用threading

    一:线程使用 线程使用有两种方法,一种是直接使用,二是通过继承threading.Thread类使用 二:函数式使用 函数式:调用thread模块中的start_new_thread()函数来产生新线 ...

  7. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  8. python网络编程--线程event

    一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...

  9. python网络编程--线程GIL(全局解释器锁)

    一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...

随机推荐

  1. 【poj1743】 Musical Theme

    http://poj.org/problem?id=1743 (题目链接) 题意 给出n个音符的乐谱,求其中不重叠的重复最长连续段,重复连续段的定义为两段音符起伏相同. Solution 论文题,相邻 ...

  2. webservice 菜鸟探索之旅

    项目背景 接到的任务是通过调用其他平台厂商提供的webservice接口来获取他们的图片数据把图片下载下来录入我司平台.之前没有接触过webservice,所以开始了这次webservice的菜鸟之旅 ...

  3. mysql 优化之查询缓存(mysql8已经废弃这个功能)

    对于缓存,一般人想到的是 redis.memcache 这些内存型的缓存. 但是实际上 mysql 也提供了缓存,mysql 里面的缓存是查询缓存,可以把我们查询过的语句缓存下来,下一次查询的时候有可 ...

  4. Matlab ------ 打开MATLAB,设置默认打开的文件夹

  5. linux(ubuntu) 常用指令

    1.新建文件夹 mkdir mkdir test 2.进入文件夹 cd cd test 3.创建/修改文件 vim vim a.txt 如果不存在a.txt,就会新增a.txt; 如果存在,则修改 先 ...

  6. 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象

    昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...

  7. zookeeper系列之:独立模式部署zookeeper服务

    一.简述 独立模式是部署zookeeper服务的三种模式中最简单和最基础的模式,只需一台机器即可,独立模式仅适用于学习,开发和生产都不建议使用独立模式.本文介绍以独立模式部署zookeeper服务器的 ...

  8. C++ Core Guidelines

    C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...

  9. -webkit-css

    WebKit CSS: 1.“盒模型”的具体描述性质的包围盒块内容,包括边界,填充等等. .test{ -webkit-border-bottom-left-radius: radius; -webk ...

  10. idea绘制activity流程图中文乱码解决

    发现问题: 绘制activity的bpm工作流程图的时候,在name项中填写中文,开始的时候没问题,显示的确是中文,关闭文件再打开发现已经乱码,重启idea效果相同,如图 解决方案:修改idea启动参 ...