python 多线程的threading中的join和setDaemon方法
join():通俗的将就是阻止子线程随着主线程的结束而结束
setDaemon():设置子线程是否随着主线程的结束而结束, 其中:
setDaemon(True) : 设置子线程随着主线程的结束而结束
setDaemon(False) 等价于join() :设置子线程不随着主线程的结束而结束
修改http://blog.youkuaiyun.com/sjyu_ustc/article/details/71080834代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading,time
def test(loop, sec):
print 'start loop', loop, 'at:', time.ctime()
time.sleep(sec)
print 'loop', loop, 'done at:', time.ctime()
def main():
print 'starting at:', time.ctime()
thpool = []
for i in xrange(10):
th = threading.Thread(target= test,args= (i,2))
th.start()
thpool.append(th)
for th in thpool:
th.join()
print 'all Done at:', time.ctime()
if __name__ == '__main__':
main()
结果:
starting at: Tue May 2 14:31:41 2017
start loop 0 at: Tue May 2 14:31:41 2017
start loop 1 at: Tue May 2 14:31:41 2017
start loop 2 at: Tue May 2 14:31:41 2017
start loop 3 at: Tue May 2 14:31:41 2017
start loop 4 at: Tue May 2 14:31:41 2017
start loop 5 at: Tue May 2 14:31:41 2017
start loop 6 at: Tue May 2 14:31:41 2017
start loop 7 at: Tue May 2 14:31:41 2017
start loop 8 at: Tue May 2 14:31:41 2017
start loop 9 at: Tue May 2 14:31:41 2017
loop 0 done at: Tue May 2 14:31:43 2017
loop 1 done at: looploop 4 loopdone at: Tue May 2 14:31:43 2017
2Tue May 2 14:31:43 2017
done at: Tue May 2 14:31:43 2017
3 done at: Tue May 2 14:31:43 2017
loop 5 done at: Tue May 2 14:31:43 2017
loop 6 done at: Tue May 2 14:31:43 2017
loop 7 done at: Tue May 2 14:31:43 2017
loop 8 done at: Tue May 2 14:31:43 2017
loop 9 done at: Tue May 2 14:31:43 2017
all Done at: Tue May 2 14:31:43 2017
可以看出修改前join方法使得每个子线程顺序执行,所有子线程执行完毕后,主线程才退出。 修改后,所有子线程几乎同时执行,之后主线程执行在退出。
修改为setDaemon方法,继续观察:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading,time
def test(loop, sec):
print 'start loop', loop, 'at:', time.ctime()
time.sleep(sec)
print 'loop', loop, 'done at:', time.ctime()
def main():
print 'starting at:', time.ctime()
for i in xrange(10):
th = threading.Thread(target= test,args= (i,2))
th.setDaemon(True)
th.start()
print 'all Done at:', time.ctime()
if __name__ == '__main__':
main()
结果:
starting at: Tue May 2 14:57:48 2017
start loop 0 at: Tue May 2 14:57:48 2017
start loop 1 at: Tue May 2 14:57:48 2017
start loop 2 at: Tue May 2 14:57:48 2017
start loop 3 at: Tue May 2 14:57:48 2017
start loop 4 at: Tue May 2 14:57:48 2017
start loop 5 at: Tue May 2 14:57:48 2017
start loop 6 at: Tue May 2 14:57:48 2017
start loop 7 at: Tue May 2 14:57:48 2017
start loop 8 at: Tue May 2 14:57:48 2017
start loop 9 at:all Done at: Tue May 2 14:57:48 2017
Tue May 2 14:57:48 2017
可以看出子线程都还没执行完,因为主线程退出也都随着主线程退出了
#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading,time
def test(loop, sec):
print 'start loop', loop, 'at:', time.ctime()
time.sleep(sec)
print 'loop', loop, 'done at:', time.ctime()
def main():
print 'starting at:', time.ctime()
for i in xrange(10):
th = threading.Thread(target= test,args= (i,2))
th.setDaemon(False)
th.start()
print 'all Done at:', time.ctime()
if __name__ == '__main__':
main()
结果:
starting at: Tue May 2 15:01:46 2017
start loop 0 at: Tue May 2 15:01:46 2017
start loop 1 at: Tue May 2 15:01:46 2017
start loop 2 at: Tue May 2 15:01:46 2017
start loop 3 at: Tue May 2 15:01:46 2017
start loop 4 at: Tue May 2 15:01:46 2017
start loop 5 at: Tue May 2 15:01:46 2017
start loop 6 at: Tue May 2 15:01:46 2017
start loop 7 at: Tue May 2 15:01:46 2017
start loop 8 at: Tue May 2 15:01:46 2017
start loop 9 all Done at: Tue May 2 15:01:46 2017
at: Tue May 2 15:01:46 2017
loop 0 done at: Tue May 2 15:01:48 2017
loop 5 done at: Tue May 2 15:01:48 2017
loop 3 done at:loop 2 done at: Tue May 2 15:01:48 2017
Tue May 2 15:01:48 2017
loop 1 done at: Tue May 2 15:01:48 2017
loop 4 done at: Tue May 2 15:01:48 2017
loop 6 done at: Tue May 2 15:01:48 2017
loop 7 done at: Tue May 2 15:01:48 2017
loop 8 done at: Tue May 2 15:01:48 2017
loop 9 done at: Tue May 2 15:01:48 2017
设置为false后,主线程退出后,子线程并没随着主线程的退出而退出