Python线程为什么搞个setDaemon?
一、Python线程为什么搞个setDaemon
当启动一个线程时设置thread.setDaemon(True),则该线程为守护线程(也可以称为后台线程)。表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免了孤儿进程的出现。
当不设置或者thread.setDaemon(False)时,主进程执行结束时,会等待线程结束。
应用:如保持网络连接(发送keep-alive心跳包)或者后台监控的线程,负责内存管理与垃圾回收(实际上JVM就是这样做的),这些线程与实际提供应用服务的线程有了逻辑上的”前/后”的概念,而如果主线程已经退出,那么这些后台线程也没有存在的必要。
如果没有这一机制,那么我们在主线程完成之后,还必须逐个地检查后台线程,然后在主线程退出之前,逐个地关闭它们. 有了前后线程的区分, 我们只需要负责管理前台线程, 完成主要的逻辑处理之后退出即可。
当子线程不设置时,主进程结束后,子线程会继续执行完后,程序结束。
import time
from hashlib import md5
from threading import Thread
def pmd(md):
time.sleep(3) #使用sleep使得该线程比主线程晚结束
print(“backend recording:”,md)
def giveures(s):
md = md5(s.encode(‘utf-8’))
res = md.digest()
t = Thread(target=pmd,args=(s,))
#t.setDaemon(True) 默认情况:t.setDaemon(False)
t.start()
return res
s = ‘chrisyang’
res = giveures(s)
print(res)
当设置时,主进程不会等待子线程,当主线程结束,子线程就会被强制停止运行并回收。
import time
from hashlib import md5
from threading import Thread
def pmd(md):
time.sleep(3) #使用sleep使得该线程比主线程晚结束
print(“backend recording:”,md)
def giveures(s):
md = md5(s.encode(‘utf-8’))
res = md.digest()
t = Thread(target=pmd,args=(s,))
t.setDaemon(True)
t.start()
return res
s = ‘chrisyang’
res = giveures(s)
print(res)
延伸阅读:
二、异步消息队列
说道消息队列,你肯定会想到Kafka、Rabbitmq等消息中间件,这些专业的消息中间件提供了很多功能特性,当然他的部署使用维护都是比较麻烦的。如果你对消息队列没那么高要求,想要轻量级的,使用Redis就没错啦。
Redis通过list数据结构来实现消息队列.主要使用到如下命令:
lpush和rpush入队列lpop和rpop出队列blpop和brpop阻塞式出队列
猜你喜欢LIKE
相关推荐HOT
更多>>
pip install 和conda install有什么区别?
一、安装源不同pip install和conda install使用不同的安装源。pip是Python的默认包管理器,它主要使用Python Package Index(PyPI)作为软件包...详情>>
2023-10-15 22:31:19
redis怎么实现数据库类似rank并列排名?
一、redis实现数据库类似rank并列排名的方法Sorted Set是一个有序的集合,其中的每个成员都会被赋予一个分数(score),通过对分数的操作可以实...详情>>
2023-10-15 17:23:44
Oracle怎么修改某个字段特定位置的字符?
一、Oracle修改某个字段特定位置的字符的方法1、查找需要修改的记录“查找需要修改的记录是指在数据库中定位需要进行修改的数据行。在进行数据...详情>>
2023-10-15 16:30:30
腾讯星图(Star Knowledge Graph)是什么样的数据库?
一、腾讯星图(Star Knowledge Graph)是什么样的数据库腾讯星图(Star Knowledge Graph,即SKG,也称知识图谱),是一个图数据库和图计算引擎...详情>>
2023-10-15 16:06:16热门推荐
scrum敏捷软件开发是什么?
沸Scrum中文网研发的工具叫什么?
热pip install 和conda install有什么区别?
热为什么微服务一定要上Docker?
新怎样用SQL语句实现查找一列中第N大值?
什么是云访问安全代理(CASB)?
MYSQL 查询库存结存数量语句怎么写?
VUE使用什么连接并搭建搭建本地数据库?
超级APP系统比市场APP系统有哪些亮点呢?
哪些平台支持Python编程?
mysql有排他锁为什么还需要共享锁呢?
为什么搜索引擎在磁盘上的索引不能做到实时添加而数据库可以?
设置数据库的字符集和设置表字段字符集的区别是什么?
windows版oracle为什么老是卸载不干净?
技术干货






