在进行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那里,等待阻塞的子线程运行结束,然后再继续执行。

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

  1. python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio

    摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...

  2. python多线程中join()的理解

    在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...

  3. python多线程中join()方法和setDaemon()方法的区别

    """ join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...

  4. 用C语言解决python多线程中的GIL问题

    在使用python多线程的时候为了解决GIL问题,有些代码得用C语言写,那么就得生成动态链接库. 当创建动态链接库时,独立位置信息(position independent)代码也需要生成.这可以帮助 ...

  5. 说说Python多线程中的daemon属性方法

    大家看多线程部分的时候肯定看到过daemon这个属性,当我在百度了一圈后也没发现有比较好的解释(或者大家对这个解释都非常清楚),于是自己通过代码和官方介绍了解它,进行了一些总结 给大家一些参考. 首先 ...

  6. python 多线程中同步的小样例

    #!/usr/bin/python # -*- coding: UTF-8 -*- # 在一个资源池中.获取资源 # Author: zhang # Date: 2015-7-27 import ti ...

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

    以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~ ...

  8. python多线程中锁的概念

    1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...

  9. 理解 Python 语言中的 defaultdict

    众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined).但是有时候,字典中的每个键都存在默认值是非常 ...

随机推荐

  1. golang1.13中重要的新特新

    本文索引 语言变化 数字字面量 越界索引报错的完善 工具链改进 GOPROXY GOSUMDB GOPRIVATE 标准库的新功能 判断变量是否为0值 错误处理的革新 Unwrap Is As gol ...

  2. JsonConfig的jsonConfig.setExcludes的用法

    1.问题描述 在项目中经常会有两个类存在一对多或者多对一的关联关系,这样在查询多的一方时,会深入查询关联的一方,而我们可能并不需要去深入查询那些数据,此时使用JsonConfig的jsonConfig ...

  3. 2017春季_京东_Java后端研发岗面经

    纸上得来终觉浅,绝知此事要躬行  ——2017春季Java后端研发工程师面试心得 收获offer:上海汉得+北京中科软+成都百词斩+成都诺基亚研发中心+清华大学计算机研究所等offer.阿里一面猝.京 ...

  4. 架构——android架构演进概述

    随着业务的发展和技术的变更,Android开发也经历了以下几个发展阶段: 看似高大上的名词,其实遵循着最简单的原则:分而治之(如何划分就是"架构",简单的事情如何串在一起就是&qu ...

  5. Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类

    一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...

  6. spring5 源码深度解析----- AOP目标方法和增强方法的执行(100%理解AOP)

    上一篇博文中我们讲了代理类的生成,这一篇主要讲解剩下的部分,当代理类调用时,目标方法和代理方法是如何执行的,我们还是接着上篇的ReflectiveMethodInvocation类Proceed方法来 ...

  7. 【Java】后台将文件上传至远程服务器

    问题:由于系统在局域网(能访问外网)内,但外网无法请求局域网内服务器文件和进行处理文件. 解决:建立文件服务器,用于存储文件及外网调用. 客户端(文件上传): package cn.hkwl.lm.u ...

  8. Vue中使用key的作用

    key的作用是为了在diff算法执行时更快的找到对应的节点,提高diff速度 key具有唯一性 vue中循环需加 :key=“唯一标识” ,唯一标识可以使item里面id index 等,因为vue组 ...

  9. 对BFC规范的理解

    什么是BFC? BFC 全称为 块级格式化上下文(Block Fromatting Context),是Web页面的可视化CSS渲染出的一部分.它是块级盒布局出现的区域,也是浮动层元素进行交互的区域. ...

  10. vue使用vant-ui实现上拉加载、下拉刷新和返回顶部

    vue使用vant-ui实现上拉加载.下拉刷新和返回顶部 vue现在在移动端常用的ui库有vant-ui和mint-ui,上拉加载.下拉刷新和返回顶部也是移动端最基础最常见的功能.下面就用vant-u ...