该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
【笔记】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