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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
在Python的Django框架中创建语言文件
Jul 27 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
python2.7的编码问题与解决方法
Oct 04 Python
Python面向对象特殊成员
Apr 24 Python
利用python画出折线图
Jul 26 Python
python实现简单五子棋游戏
Jun 18 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
matplotlib阶梯图的实现(step())
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
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
layui表格实现代码
2017/05/20 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python解析xml文件操作实例
2014/10/05 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
Python合并多个Excel数据的方法
2018/07/16 Python
Python pandas用法最全整理
2019/08/04 Python
python socket 聊天室实例代码详解
2019/11/14 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
预备党员党校学习自我评价分享
2013/11/12 职场文书
学校七一活动方案
2014/01/19 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
开票员岗位职责
2015/02/12 职场文书
Golang解析JSON对象
2022/04/30 Golang
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS