python浅析守护线程与非守护线程的区别与使用

目录
  • 什么是守护线程
  • 非守护线程
  • 守护线程

什么是守护线程

  • 当主线程执行结束后,所有 在运行的子线程都 直接结束,不管子任务是否完成
  • 很多语言的 垃圾收集器 就运用了 守护线程,去回收程序不再使用的垃圾内存
  • 而非守护线程其实就跟守护线程相反,当主线程结束后,如果子线程还在运行,子线程并不会直接结束,而是 继续完成任务,等待子线程都执行完毕才结束

非守护线程

  • 下面是一个普通线程的例子,也就是 非守护线程
  • 我们创建了 autofelix 购物线程,去模拟购物流程的任务
  • 可以看出当主线程已经结束,但是子线程依然 没有退出
  • 因为 shopping 这个子线程任务还在工作,所以程序会一直运行下去
import threading
import time
def shopping():
    while True:
        print("飞兔小哥 进入了商场...'")
        time.sleep(1)
if __name__ == '__main__':
    autofelix = threading.Thread(target=shopping)
    autofelix.start()
    print('飞兔小哥 准备出去买东西...')
    time.sleep(0.5)
    print('飞兔小哥 看到了西红柿...')
    time.sleep(0.5)
    print('飞兔小哥 又买了土豆...')
    time.sleep(0.5)
    print('飞兔小哥 回家了!')

# 运行结果
飞兔小哥 进入了商场...'
飞兔小哥 准备出去买东西...
飞兔小哥 看到了西红柿...
飞兔小哥 又买了土豆...
飞兔小哥 进入了商场...'
飞兔小哥 回家了!
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
飞兔小哥 进入了商场...'
........

守护线程

  • 我们可以通过设置 xxx.daemon = True 将线程变成守护线程
  • 必须在启动之前将线程配置为守护程序或非守护程序,否则 python 将引发运行时错误
  • 守护程序线程不会像普通线程一样正常退出,所以要确保,子任务的异常结束不会产生任何负面影响
import threading
import time
def shopping():
    while True:
        print("飞兔小哥 进入了商场...'")
        time.sleep(1)
if __name__ == '__main__':
    autofelix = threading.Thread(target=shopping)
    autofelix.daemon = True
    autofelix.start()
    print('飞兔小哥 准备出去买东西...')
    time.sleep(0.5)
    print('飞兔小哥 看到了西红柿...')
    time.sleep(0.5)
    print('飞兔小哥 又买了土豆...')
    time.sleep(0.5)
    print('飞兔小哥 回家了!')

# 运行结果
飞兔小哥 进入了商场...'
飞兔小哥 准备出去买东西...
飞兔小哥 看到了西红柿...
飞兔小哥 进入了商场...'
飞兔小哥 又买了土豆...
飞兔小哥 回家了!

到此这篇关于python浅析守护线程与非守护线程的区别与使用的文章就介绍到这了,更多相关python守护线程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 对python 多线程中的守护线程与join的用法详解

    多线程:在同一个时间做多件事 守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程结束时,子线程依然在执行. thread.join():在子线程完成运行之前,该子线程的父线程(一般就是主线程)将一直存在,也就是被阻塞 实例: #!/usr/bin/python # encoding: utf-8 import threading fro

  • Python多线程Threading、子线程与守护线程实例详解

    本文实例讲述了Python多线程Threading.子线程与守护线程.分享给大家供大家参考,具体如下: 线程与进程: 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理. 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 在单个程序中同时运行多个线程完成不同的工作,称为多线程 对于IO密集型的程序来说,多线程可以利用读IO的时间去做其他事[IO并不占用CPU,这就好像A

  • Python多线程threading join和守护线程setDeamon原理详解

    同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作:cpu执行的都是线程,默认程序会开一个主线程:进程是程序以及和程序相关资源的集合:某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明 简单的多线程 import threading, time def test1(x): time.sleep(5) print(x**x) #下面定义两个线程调用test1这个函数,创建多线程使用如下语法,target后面跟函数名,args传递

  • python实现守护进程、守护线程、守护非守护并行

    守护进程 1.守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to havechildren 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 我们来看一个例子 from multiprocessing import Process import os,time,random def task(): p

  • Python守护线程用法实例

    本文实例讲述了Python守护线程用法.分享给大家供大家参考,具体如下: 如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的daemon属性.即在线程开始(thread.start())之前,调用setDeamon()函数,设定线程的daemon标志.(thread.setDaemon(True))就表示这个线程"不重要". 如果你想等待子线程完成再退出,那就什么都

  • python浅析守护线程与非守护线程的区别与使用

    目录 什么是守护线程 非守护线程 守护线程 什么是守护线程 当主线程执行结束后,所有 在运行的子线程都 直接结束,不管子任务是否完成 很多语言的 垃圾收集器 就运用了 守护线程,去回收程序不再使用的垃圾内存 而非守护线程其实就跟守护线程相反,当主线程结束后,如果子线程还在运行,子线程并不会直接结束,而是 继续完成任务,等待子线程都执行完毕才结束 非守护线程 下面是一个普通线程的例子,也就是 非守护线程 我们创建了 autofelix 购物线程,去模拟购物流程的任务 可以看出当主线程已经结束,但是

  • 【java 多线程】守护线程与非守护线程的详解

    Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通.非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程.当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了.如果有非守护线程仍然存活,VM就不会退出. 守护线程并非只有虚拟机内部提供,用户在编写程序

  • 浅析php静态方法与非静态方法的用法区别

    在php编程中,static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为"类属性"或"类方法" 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号"::"调用. static关键字可以用来修饰变量.方法. 不经过实例化,就可以直接访问类中static的属性和static的方法. static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法.因为静态属性

  • 浅谈java的守护线程与非守护线程

    最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以前忽略了). 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平

  • Java线程优先级和守护线程原理解析

    一.线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于"低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是"用户线程":否则就是"守护线程".用户线程一般用于执行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是:Java虚拟机在&quo

  • Python多线程:主线程等待所有子线程结束代码

    我就废话不多说了,还是直接看代码吧! from time import ctime import threading import time def a():     #for i in range(5):         print('Program a is running... at ', ctime(),u'.线程名为:',threading.current_thread().name )         time.sleep(0.2)          def b(x):     #f

  • Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

    本文实例讲述了Python提示[Errno 32]Broken pipe导致线程crash错误解决方法.分享给大家供大家参考.具体方法如下: 1. 错误现象 ThreadingHTTPServer 实现的 http 服务,如果客户端在服务器返回前,主动断开连接,则服务器端会报 [Errno 32] Broken pipe 错,并导致处理线程 crash. 下面先看个例子,python 版本: 2.7 示例代码 复制代码 代码如下: #!/usr/bin/env python #!coding=u

  • Java并发编程示例(八):处理线程的非受检异常

    Java语言中,把异常分为两类: 受检异常: 这类异常必须在throws子句中被显式抛出或者在方法内被捕获.例如,IOException异常或ClassNotFoundException异常. 非受检异常: 这类异常不需要显式抛出或捕获.例如,NumberFormatException异常. 当一个受检异常在Thread对象的run()方法中被抛出时,我们必须捕获并处理它,因为run()方法不能抛出异常.而一个非受检异常在Thread对象的run()方法中被抛出时,默认的行为是在控制台打印出堆栈

  • python 对类的成员函数开启线程的方法

    如下所示: # -*- coding: utf-8 -*- import threading import thread import time class Test(object): def __init__(self): # threading.Thread.__init__(self) self._sName = "machao" def process(self): #args是关键字参数,需要加上名字,写成args=(self,) th1 = threading.Thread

随机推荐