python守护线程和非守护线程_守护线程和非守护线程区别

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

【笔记】Python中多线程的两种方式以及setDeamon守护线程原理 转载 2015-06-10 03:09:37

一般Python中的多线程操作有两种方式:函数式(thread)和继承(threading.Threading)式,学习之余顺便普及下threading模块中Thread类的常用参数方法:【新浪blog的代码排版麻烦,就不贴代码了……】

函数式的流程大概是这样的:创建一个活动函数,然后再把函数当做参数传入。这里有两种方式,首先第一种取自thread模块:定义了动作函数fun(a,b)之后,使用thread.start_new_thread(fun,(a,b))启动线程。而在threading模块中,则使用threading.Thread(target=fun,args=(a,b)).start()。

而集成类的方法中我们先去继承一个来自threading.Thread的类,具体的功能写在self.run()中。这种方式比较方便,大不了可以重写Thread的类。。

setDaemon()守护线程:

守护线程是什么呢,大概就是在linux系统中脱离于终端存在的线程,并且优先级很低,一般在后台运行并且不会在终端上显示任何信息。在linux的进程管理中,父进程在创建子进程之后先于子进程退出,会造成这个子进程变为“孤儿进程”。

而根据原装官方文档的解释,主线程在所有非守护线程都死亡后才会被kill,这样当你忘记使用threading.Thread.exit_thread()或者thread_stop()的时候,嘿嘿,你的程序中主线程收到结束信号,但是因为有一个非守护进程的存在,所以等待。但是因为你忘记了设置kill掉子线程,结果变成了死循环。。。好了,父子两代互相等【瞪】着“:你先! :不,你先!”,就这样死循环了。。但是当我们设置setDaemon(True)的时候,发送一个SIGNAL到主线程,主线程看了看没有还活着的非守护线程了所以死掉了,子线程也会自杀。要知道守护线程有一个别名叫做“服务线程”,在没有需要它服务的其他线程之后会自杀(所以垃圾回收的线程也是一个守护线程……)。

并且因为setDaemon(True/False)的值直接继承自父线程,所以默认为False(非守护线程),所以在threading.Thread(target=fun,args=(a,b)).start()之前用啊啊啊啊啊!!!!

就酱,以上

资料来源:http://blog.sina.com.cn/s/blog_733ceb570102vndo.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值