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检测服务器是否正常
Feb 16 Python
python类和函数中使用静态变量的方法
May 09 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
python深copy和浅copy区别对比解析
Dec 26 Python
keras中的卷积层&池化层的用法
May 22 Python
python不同系统中打开方法
Jun 23 Python
基于python实现操作git过程代码解析
Jul 27 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执行速率优化技巧小结
2008/03/15 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
Python yield的用法实例分析
2020/03/06 Python
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
小区停车场管理制度
2014/01/27 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
紫日观后感
2015/06/05 职场文书
深入理解 Golang 的字符串
2022/05/04 Golang