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 相关文章推荐
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python操作MySQL模拟银行转账
Mar 12 Python
Python使用Django实现博客系统完整版
Sep 29 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
flask框架使用orm连接数据库的方法示例
Jul 16 Python
详解flask入门模板引擎
Jul 18 Python
python编写简单端口扫描器
Sep 04 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
jupyter notebook 增加kernel教程
Apr 10 Python
通过实例简单了解python yield使用方法
Aug 06 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
PHP的几个常用加密函数
2016/02/03 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
js 字符串转化成数字的代码
2011/06/29 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
AngularJS equal比较对象实例详解
2016/09/14 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python生成器的使用方法
2013/11/21 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
详解python持久化文件读写
2019/04/06 Python
Django REST framwork的权限验证实例
2020/04/02 Python
Python包和模块的分发详细介绍
2020/06/19 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
树莓派升级python的具体步骤
2020/07/05 Python
python中实现栈的三种方法
2020/12/19 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
Java程序员面试90题
2013/10/19 面试题
2015年学校减负工作总结
2015/05/19 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL