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进程间通信用法实例
Jun 04 Python
Python如何快速实现分布式任务
Jul 06 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
使用python制作一个解压缩软件
Nov 13 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
TensorFlow tensor的拼接实例
Jan 19 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
Feb 26 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
django 模型中的计算字段实例
May 19 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
Autopep8的使用(python自动编排工具)
Mar 02 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/11/12 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
公务员上班玩游戏检讨书
2014/09/17 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
妈妈别哭观后感
2015/06/08 职场文书
债务追讨律师函
2015/06/24 职场文书
感恩教师节主题班会
2015/08/12 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python
python turtle绘图
2022/05/04 Python