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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
Python求解平方根的方法
Mar 11 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Python微信操控itchat的方法
May 31 Python
创建Django项目图文实例详解
Jun 06 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
Python3列表List入门知识附实例
Feb 09 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
Pytest中skip skipif跳过用例详解
Jun 30 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 年龄计算函数(精确到天)
2012/06/07 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
Jquery动态列功能完整实例
2019/08/30 jQuery
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
理解Python垃圾回收机制
2016/02/12 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
如何用Python合并lmdb文件
2018/07/02 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
HTML5应用之文件上传
2016/12/30 HTML / CSS
电脑销售顾问自荐信
2014/01/29 职场文书
安全教育感言
2014/03/04 职场文书
空气的环保标语
2014/06/12 职场文书
伦敦奥运会口号
2014/06/13 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
2015政治思想表现评语
2015/03/25 职场文书
酒会开场白大全
2015/06/01 职场文书
繁星春水读书笔记
2015/06/30 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL