python使用Thread的setDaemon启动后台线程教程


Posted in Python onApril 25, 2020

多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现)

后台线程与前台线程的直接区别是,

1)setDaemon(True): 当主线程退出时,后台线程随机退出;

2)setDaemon(False)(默认情况): 当主线程退出时,若前台线程还未结束,则等待所有线程结束,相当于在程序末尾加入join().

实例:

例子描述:主线程调用giveures给出字符串s的md5摘要,同时在giveures当中启动一个线程打印字符串内容.

1.前台线程

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)
exit()

运行结果:

b'h#\x86|\xa0\xeff\xc7u\xba\x18\xb2\xd2s\xf9\x9e'
backend recording: chrisyang

第一行打印出来之后,隔3s后打印出第二行,说明在等待pmd线程结束后进程才退出.

2.后台线程

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)
exit()

运行结果:

b'h#\x86|\xa0\xeff\xc7u\xba\x18\xb2\xd2s\xf9\x9e'

pmd线程因为sleep挂起一段时间,因此在主线程完成时还未结束就被强制退出了.

知识归纳:

以上的是前后台线程的外在区别,至于内在区别,转自Stack Overflow的一个精炼回答:

后台线程的责任是为整个主线程提供服务,如保持网络连接(发送keep-alive心跳包),负责内存管理与垃圾回收(实际上JVM就是这样做的). 因此这些线程与实际提供应用服务的线程有了逻辑上的”前/后”的概念,而如果主线程已经退出,那么后台线程也没有存在的必要.

如果没有这一机制,那么我们在主线程完成之后,还必须逐个地检查后台线程,然后在主线程退出之前,逐个地关闭它们. 有了前后线程的区分, 我们只需要负责管理前台线程, 完成主要的逻辑处理之后退出即可.

原文:

Daemon Threads Explanation

以上这篇python使用Thread的setDaemon启动后台线程教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中日期和时间格式化输出的方法小结
Mar 19 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
python多线程实现TCP服务端
Sep 03 Python
jupyter notebook的安装与使用详解
May 18 Python
python中有帮助函数吗
Jun 19 Python
python speech模块的使用方法
Sep 09 Python
详解Python流程控制语句
Oct 28 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 #Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 #Python
解决python父线程关闭后子线程不关闭问题
Apr 25 #Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 #Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 #Python
python 追踪except信息方式
Apr 25 #Python
Python实现捕获异常发生的文件和具体行数
Apr 25 #Python
You might like
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python opencv调用笔记本摄像头
2019/08/28 Python
Python验证码截取识别代码实例
2020/05/16 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
学生实习自我鉴定
2013/10/11 职场文书
体育教师求职信
2014/06/30 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
5个实用的JavaScript新特性
2022/06/16 Javascript