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中使用PDB库调试程序
Apr 05 Python
python实现发送和获取手机短信验证码
Jan 15 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
PyQt5每天必学之拖放事件
Aug 27 Python
详解python3中tkinter知识点
Jun 21 Python
Python rstrip()方法实例详解
Nov 11 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
python模拟实现分发扑克牌
Apr 22 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连mysql和oracle数据库性能比较
2006/10/09 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php中switch语句用法详解
2015/08/17 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
javascript json2 使用方法
2010/03/16 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
js登录弹出层特效
2014/03/07 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
js限制input标签中只能输入中文
2015/06/26 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vue组件横向树实现代码
2018/08/02 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
python根据路径导入模块的方法
2014/09/30 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
Python3内置模块random随机方法小结
2019/07/13 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
工程班组长岗位职责
2013/12/30 职场文书
应聘教师自荐信
2015/03/26 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书