python中threading的setDaemon、join的用法-女黑客 - Powered by Discuz! Archiver

nvhack 发表于 2017-3-13 11:58:55

python中threading的setDaemon、join的用法

python 中的thread的一些机制:python 主线程结束后,会默认等待子线程结束后,主线程才退出。
#coding=utf-8
import threading
from time import ctime,sleep

def music(func):
        for i in range(2):
                print "I was listening to %s. %s" %(func,ctime())
                sleep(1)

def move(func):
        for i in range(2):
                print "I was at the %s ! %s" %(func,ctime())
                sleep(5)


threads = []
t1 = threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1)
t2 = threading.Thread(target=move,args=(u'阿凡达',))
threads.append(t2)

if __name__ == '__main__':
        for t in threads:
                #t.setDaemon(True)
                t.start()
        #t.join()
        print "all over %s" %ctime()运行结果如下:
I was listening to 爱情买卖. Mon Mar 13 11:51:55 2017
I was at the 阿凡达 ! Mon Mar 13 11:51:55 2017
all over Mon Mar 13 11:51:55 2017
I was listening to 爱情买卖. Mon Mar 13 11:51:56 2017
I was at the 阿凡达 ! Mon Mar 13 11:52:00 2017


主线程 all over Mon Mar 13 11:51:55 2017 已经结束了,但是子线程还在继续运行。
python 对于 thread的管理中有两个函数 join和 setDaemon
join: 如果在一个线程B中调用b.join(),则在b结束后,b才会接着b.join()往后运行
setDaemon: 主线程A启动了子线程B,调用b.setDaemaon(True),则主线程结束时,会把子线程B也杀死。

if __name__ == '__main__':
        for t in threads:
                t.setDaemon(True)
                t.start()
        #t.join()
        print "all over %s" %ctime()运行结果:
I was listening to 爱情买卖. Mon Mar 13 11:56:38 2017
I was at the 阿凡达 ! Mon Mar 13 11:56:38 2017
all over Mon Mar 13 11:56:38 2017


all over Mon Mar 13 11:56:38 2017 主线程结束后,不在有输出
如果想让子线程运行完毕,那么添加join方法。
if __name__ == '__main__':
        for t in threads:
                t.setDaemon(True)
                t.start()
        t.join()
        print "all over %s" %ctime()输出如下:
I was listening to 爱情买卖. Mon Mar 13 11:58:08 2017
I was at the 阿凡达 ! Mon Mar 13 11:58:08 2017
I was listening to 爱情买卖. Mon Mar 13 11:58:09 2017
I was at the 阿凡达 ! Mon Mar 13 11:58:13 2017
all over Mon Mar 13 11:58:18 2017





nvhack 发表于 2017-3-13 12:00:51

总结:
实际上就是,多线程,你不加setDaemon和join方法,那么主线程结束后,子线程会继续运行。
如果你加了setDaemon方法,那么主线程结束后,就直接杀死子线程
如果你想让子线程运行完毕,那么你加了setDaemon方法,再加个join方法,那么子线程结束后,才会会继续执行后面的主线程。
页: [1]
查看完整版本: python中threading的setDaemon、join的用法