彻底理解Python多线程中的setDaemon与join【配有GIF示意】

在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别。

1、join ()

例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),

那么,主线程A会在调用的地方阻塞,直到子线程B完成操作后,才可以接着往下执行。

2、setDaemon()

例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),

即:把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。

注意:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

3、区别

两者基本是相反的(join主线程等子线程完事【横刀立马】,setDaemon主线程管好自己就可以了,不等子线程完事【义无反顾】)。

4、代码层面理解

# coding:utf-8
import threading
import time

def get_list_page():
    print("列表页抓取开始\n")
    time.sleep(3)
    print("列表页抓取结束\n")

def get_detail_page():
    print("详情页抓取开始\n")
    time.sleep(2)
    print("详情页抓取结束\n")

# 创建两个子线程
thread1 = threading.Thread(target=get_list_page)
thread2 = threading.Thread(target=get_detail_page)

start_time = time.time()

# # 设置线程守护
# thread1.setDaemon(True)
# thread2.setDaemon(True)

# 启动两个线程
thread1.start()
thread2.start()

# # 设置线程阻塞
# thread1.join()
# thread2.join()

print("Run time is {}".format(time.time() - start_time)) 

运行结果:

解释:

三个线程基本属于并发,主线程、子线程1、子线程2会同时运行,各干各的,

并且,主线程会等到两个子线程结束后,才会结束。

设置线程守护(setDaemon()) 即反注释24-26行:

解释:

有了守护线程之后,主线程就会在自身结束后,(不管守护线程还是不是在运行)kill掉守护线程。

设置线程阻塞(join()) 即反注释32-34行:

解释:

有了线程阻塞后,主线程就会停在join那里,等待阻塞的子线程运行结束,然后再继续执行。

原文地址:https://www.cnblogs.com/liangmingshen/p/11781433.html

时间: 2024-10-08 06:12:10

彻底理解Python多线程中的setDaemon与join【配有GIF示意】的相关文章

python多线程中锁的概念

python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import thr

练习生产者与消费者-PYTHON多线程中的条件变量同步

以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~~~~~~~ 互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件

理解 Python 语言中的 defaultdict

众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined).但是有时候,字典中的每个键都存在默认值是非常方便的.例如下面的例子: strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy') counts = {} for kw in strings: counts[kw] += 1 该例子统

Python多线程中阻塞(join)与锁(Lock)的使用误区

参考资料:https://blog.csdn.net/cd_xuyue/article/details/52052893 1使用两个循环分别处理start和join函数.即可实现并发. threads = [Thread() for i in range(5)] for thread in threads: thread.start() for thread in threads: thread.join() 2 要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁. 原文地

【Python】关于Python多线程的一篇文章转载

yeayee ------>更多技巧------>更多源码------>http://www.yeayee.com Python 一篇学会多线程 多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两件事儿,那么一

Python多线程实例

前言 感觉理解python多线程用“切换”和“共享”就差不多了.这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑..... 实例:抢车票 抢车票有三类人:会员.弄了加速包.普通人. 说说区别: 钱带来的不公平:会员先跑,然后加速包,最后普通人 可以欣慰的公平:跑道一样长 守护线程SetDaemon 不设置守护进程 1 import threading 2 import time 3 #使用函数式 4 5 #会员 6 def vip(t1): 7 global num 8 time.s

【跟我一起学Python吧】Python 多线程

其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: Python代码   from time import ctime,sleep from thread import start_new_thread def loop1(): print "enter loop1:",ctime(); sleep(3); print "leave loop1:",ctime(

Python多线程的理解和使用(一)Threading中join()函数的理解

1. 多线程的概念 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等.线程在执行过程中与进程还是有区别的.每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程

理解 Python 中的线程

原地址:http://blog.jobbole.com/52060/ 本文由 伯乐在线 - acmerfight 翻译自 Akshar Raaj.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争.你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果.声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西. 示例1 我们将要请求五个不同的url: 单线程 1 2