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发送SMTP邮件的教程
Apr 29 Python
开始着手第一个Django项目
Jul 15 Python
python实现获取Ip归属地等信息
Aug 27 Python
Python实现的排列组合计算操作示例
Oct 13 Python
python3下实现搜狗AI API的代码示例
Apr 10 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
python实现简单成绩录入系统
Sep 19 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python中id函数运行方式
Jul 03 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 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相当简单的分页类
2008/10/02 PHP
PHP 字符串分割和比较
2009/10/06 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
python 数据类型强制转换的总结
2021/01/25 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
物理专业本科生自荐信
2014/01/30 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
婚宴来宾致辞
2015/07/28 职场文书
2016特色励志班级口号
2015/12/24 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python