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之变量和参数
Oct 10 Python
Python易忽视知识点小结
May 25 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
Python autoescape标签用法解析
Jan 17 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
python实现简单的三子棋游戏
Apr 28 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 木马攻击防御技巧
2009/06/13 PHP
PHP重定向的3种方式
2013/03/07 PHP
PHP多文件上传实例
2015/07/09 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
解读Python中degrees()方法的使用
2015/05/18 Python
python关键字and和or用法实例
2015/05/28 Python
Python检测网站链接是否已存在
2016/04/07 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
python如何安装下载后的模块
2020/07/03 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
项目投资合作意向书
2014/07/29 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby