关于守护进程和守护线程的区别

一、守护进程

1.1、什么是守护进程?

    1、守护进程会在主进程代码运行结束的情况下,立即挂掉。

    2、守护进程本身就是一个子进程。

3、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,

1.2、为什么要用守护进程?

    1、守护进程本身就是一个子进程,所以在主进程需要将任务并发执行的时候需要开启子进程。
    2、当该子进程执行的任务生命周期伴随着主进程的生命周期时,就需要将该子进程做成守护进程。

二、守护线程

2.1、什么是守护线程?

    1、

守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉"。并不是主线程运行完毕后守护线程挂掉。这一点是和守护进程的区别之处!

    2、守护线程守护的是:当前进程内所有的子线程!

3、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

2.2、主线程与进程的关系

    1、主线程的生命周期就是一个进程的生命周期

2、主进程等待子进程是因为主进程要负责回收子进程的系统资源,主线程等待子线程是因为主线程要等待子线程运行完毕(子线程运行完毕后,这个进程才算运行完毕)后,主线程才结束。

关于stoped状态的主线程是不是死了,在网上看到一个大佬的回答

线程在进入Stopped状态后, 就会被销毁, 是不可能再次Start的.要再次Start只能重新建立一个. 这个上面很多人也已经说过了.
但没有人解释为什么线程池中线程却可以重复利用,如果线程池中线程也是执行完任务后进入Stopped状态, 下次再新建并Start的话,很显然那就不叫线程池了.
所以, 线程池中的线程在执行完任务后,并没有进入Stopped状态,实际上线程池线程实际上是利用类似WaitHandle.WaitOne 方法在指定句柄上等待,直到有新任务到来.执行完后就再次等待. 基于你的重复利用线程的要求, 及你目前程度. 推荐你使用.NET的线程池, 自己实现线程池,要做的好的话..也是要花些功夫的..........

原文地址:https://www.cnblogs.com/chanyuli/p/11552384.html

时间: 2024-10-08 21:33:52

关于守护进程和守护线程的区别的相关文章

守护进程与守护线程的区别

守护进程与守护线程的区别 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 详细解释: #1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, #2 主线程在其他非守护线程运行完

[Linux] 守护进程和守护线程

对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言,线程是完全可以由自己的API自由产生.例如new Thread().但是进程就不同,必须通过调用OS的API,如Runtime.getRuntime.exec(). 所以说,进程是OS级别的概念. 守护线程和用户线程的区别: 二者其实基本上是一样的.唯一的区别在于JVM何时离开. 用户线程:当存在任

浅谈守护进程和守护线程

线程是由进程开启的,当开启线程的进程离开时,该线程也自然而然的去了. 一般情况下, Python 中的多线程操作有两种方式: 1.函数式 创建一个活动函数,将函数当做参数传入,然后用 threading 模块: threading.Thread(target = 函数名,args = (a,b)) 2.继承 去继承一个来自 threading.Thread 的类,功能写在 self.run() 中 方法1: from threading import Thread import time def

LoadRunner中进程运行和线程运行区别

LoadRunner中进程运行和线程运行区别 发布时间: 2012-5-23 10:29    作者: 田志良    来源: 51Testing软件测试网采编 字体:  小  中  大  | 上一篇 下一篇 | 打印  | 我要投稿  | 推荐标签: 性能测试 软件测试 LoadRunner loadrunner 测试工具 LoadRunner controller将使用驱动程序mmdrv运行Vuser.用户可以在controller的run-time setting中选择Vuser的运行方式,

守护进程VS守护线程

守护(daemon)进程 引入: join()方法可以使一个进程运行完之后再执行下一个进程,而daemon()方法就是主进程的代码执行完毕之后,不需要等待子进程,立即终止子进程. join()方法和daemon()方法都是改变进程顺序的方法. 特点: 1.daemon()方法要写在start()方法之前. 2.子进程被设置成守护进程后,一旦主进程代码执行完毕,不管子进程是否运行完毕,子进程都会立即终止. 代码示例: 1 from multiprocessing import Process 2

守护进程及守护进程输出

1 创建一个输出程序 2 创建一个守护进程 1 创建一个输出程序 守护进程不与终端联系,所以,需要另外创建一个程序用于输出. 也可以直接使用/bin/echo ----- example_daemon_help.cc #include <stdio.h> int main(int argc, char** argv) { if(argc == 1) { printf("only one parameter \n"); } else if(argc == 2) { print

性能测试工具LoadRunner中进程运行和线程运行区别

loadrunner controller将使用驱动程序mmdrv运行Vuser.用户可以在controller的run-time setting中选择Vuser的运行方式, 是多进程方式or多线程方式. 如果选择以线程方式来运行虚拟用户: 在场景设置时,“是单行脚本,还是多行脚本”会决定系统启动的进程数的多少: 假设并发用户设置为30,如果是单行30个用户,系统只需启动一个进程; 假设并发用户设置为30,如果是多行,30行,每行一个用户,系统就需要启动30个进程; 如果选择以进程方式来运行虚拟

守护线程与守护进程

一 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 from multiprocessing import Process import time import random class Piao(Process): de

多进程(了解),守护进程,互斥锁,信号量,进程Queue与线程queue

一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing import Process from threading import Thread import time def foo(): # 守护进程 print(123) time.sleep(1) print("end123") def bar(): print(456) time.sl