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集合类型用法分析
Apr 08 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
Python 常用string函数详解
May 30 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
详解python:time模块用法
Mar 25 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
Python模块future用法原理详解
Jan 20 Python
Python常用模块函数代码汇总解析
Aug 31 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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
改进的IP计数器
2006/10/09 PHP
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php巧获服务器端信息
2006/12/06 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
node app 打包工具pkg的具体使用
2019/01/17 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
解决小程序无法触发SESSION问题
2020/02/03 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python中list初始化方法示例
2016/09/18 Python
Python字符串处理实例详解
2017/05/18 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
学生实习介绍信
2014/01/15 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
初级党校心得体会
2014/09/11 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
优秀英文求职信范文
2015/03/19 职场文书