守护线程与守护进程

一 守护进程

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

from multiprocessing import Process
import time
import random

class Piao(Process):
    def __init__(self,name):
        self.name=name
        super().__init__()
    def run(self):
        print('%s is piaoing' %self.name)
        time.sleep(random.randrange(1,3))
        print('%s is piao end' %self.name)


p=Piao('egon')
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print('主')
import time
def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")


p1=Process(target=foo)
p2=Process(target=bar)

if __name__ == '__main__':
    p1.daemon=True
    p1.start()
    p2.start()
    print("main-------")

二  守护线程

from threading import Thread,currentThread
from multiprocessing import Process
import os,time,threading
def talk1():
    time.sleep(10)
    print('%s is running' %currentThread().getName())
def talk2():
    time.sleep(2)
    print('%s is running' %currentThread().getName())
if __name__ == '__main__':
    t1=Thread(target=talk1)
    t2=Thread(target=talk2)
    t1.daemon=True
    t1.start()
    t2.start()
    print('主线程',os.getpid())
from threading import Thread
import time
def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")


t1=Thread(target=foo)
t2=Thread(target=bar)

t1.daemon=True
t1.start()
t2.start()
print("main-------")

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

无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行

#1.对主进程来说,运行完毕指的是主进程代码运行完毕

#2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

详细解释:

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

★Kali信息收集~ 5.The Harvester:邮箱挖掘器

官网:http://www.edge-security.com 安装:apt-get install theHarvester 运行:终端输入 theharve...

2887
来自专栏深度学习之tensorflow实战篇

pycharm 之模块与模块引用

首先在pycharm,创建文件的快捷键ALT+INS,可以将自己常用的模版导入 ? 其次函数的模块调用规则如下图 ? 模块引用并指导源文...

3169
来自专栏Python小屋

Python自定义类支持with关键字

在任何语言中,文件操作都要遵循打开文件-操作文件-关闭文件,数据库操作也要遵循打开数据库连接-操作数据库-关闭数据库连接,网络编程中很多也具有同样的约定。下面的...

37913
来自专栏康怀帅的专栏

GitHub Pages 常见问题

本文列举了一些使用 GitHub Pages 遇到的问题及其解决方法。 资源 404 你可以使用以下方法中的一种来解决该问题。 禁用 jekyll 以 _下划线...

2863
来自专栏python3

python3--中的进程操作--multiprocess模块

运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现...

961
来自专栏Hongten

hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换)

花了一些时间理解hibernate中的java对象的几种状态,很容易就懂了,这里记录一下,分享给大家!!

1193
来自专栏Petrichor的专栏

pycharm: 跳转 & 回退

1322
来自专栏自动化测试实战

flask第二十一篇——练习题

2326
来自专栏前端小叙

nodejs的__dirname与__filename

__filename变量获取当前模块文件的带有完整绝对路径的文件名;【包含文件名本身的绝对路径】 __dirname变量获得当前文件所在目录的完整目录名。【不包...

2847
来自专栏CaiRui

Python模块

简介: 模块:用一坨代码实现了某个功能的代码集合。分为三种: 自定义模块 第三方模块 内置模块 python去找模块的路径 ? 其中,第三方模块安装的位置 ? ...

2208

扫码关注云+社区