彻底理解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那里,等待阻塞的子线程运行结束,然后再继续执行。
彻底理解Python多线程中的setDaemon与join【配有GIF示意】的更多相关文章
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- python多线程中join()的理解
在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...
- python多线程中join()方法和setDaemon()方法的区别
""" join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...
- 用C语言解决python多线程中的GIL问题
在使用python多线程的时候为了解决GIL问题,有些代码得用C语言写,那么就得生成动态链接库. 当创建动态链接库时,独立位置信息(position independent)代码也需要生成.这可以帮助 ...
- 说说Python多线程中的daemon属性方法
大家看多线程部分的时候肯定看到过daemon这个属性,当我在百度了一圈后也没发现有比较好的解释(或者大家对这个解释都非常清楚),于是自己通过代码和官方介绍了解它,进行了一些总结 给大家一些参考. 首先 ...
- python 多线程中同步的小样例
#!/usr/bin/python # -*- coding: UTF-8 -*- # 在一个资源池中.获取资源 # Author: zhang # Date: 2015-7-27 import ti ...
- 练习生产者与消费者-PYTHON多线程中的条件变量同步-Queue
以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~ ...
- python多线程中锁的概念
1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...
- 理解 Python 语言中的 defaultdict
众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属性,则返回undefined).但是有时候,字典中的每个键都存在默认值是非常 ...
随机推荐
- Spring 梳理-MVC-前端控制器DispatchServlet及URL请求处理过程
大多数基于java的web框架,都有前端控制器 spring mvc请求过程 1. 请求会首先发送到DispatchServlet,这是spring的前置Servlet,它会接收请求并转发给sprin ...
- j2ee开发之struts2框架学习笔记
Struts2框架技术重点笔记 1.Struts2 是在webwork基础上发展而来. 2.Struts2 不依赖struts API和 servlet API 3.Struts2提供了拦截器,表现层 ...
- JS 生成唯一值UUID
md5加密new Date()生成的值可能不是唯一的,另一种生成唯一值的方式: getUID: function() { // 获取唯一值 return 'xxxxxxxx-xxxx-4xxx-yxx ...
- Win10 安装配置 MongoDB 4.0 踩坑记
redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 于是一趟被我复杂化的踩坑之旅就开始了,同时也记录一下,避免有人遇见跟我一样的问题. 首先在 ...
- Webstorm轻松部署项目至服务器
wo大前端在开发环境下,需要将项目部署到测试环境,webstorm进行基础配置操作就可实现. 一.在Deployment选项下配置远程服务器地址 点击加号,选择type类型,Name自己填,帮你找到这 ...
- MongoDB 学习笔记之 DBRef
DBRef: MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).内嵌比较好理解,就是字段内容是个数组,数组内再包含文档,而我们今天介绍的是另一种,称为链接DBRef.由 ...
- 使用golang插入mysql性能提升经验
前言 golang可以轻易制造高并发,在某些场景很合适,比如爬虫的时候可以爬的更加高效.但是对应某些场景,如文件读写,数据库访问等IO为瓶颈的场合,就没有什么优势了. 前提基础 1.golang数据库 ...
- android设置透明状态栏
先是半透明效果(两种方法): 第一种(简单): //直接将下面的代码放在activity中的setContentView(R.layout.activity_main);中之前就行了 if (Buil ...
- node与mysql的相互使用————node+mysql
node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...
- Cohen-Sutherland算法
Cohen-Sutherland算法 本算法又称为编码裁剪算法,算法的基本思想是对每 条直线段分三种情况处理: (1)若点p1和p 2完全在裁剪窗口内 “简取”之 (2)若点p1(x1,y1)和p2( ...