python中threading的setDaemon、join的用法-女黑客-必火安全学院

女黑客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

python中threading的setDaemon、join的用法

[复制链接]
发表于 2017-3-13 11:58:55 | 显示全部楼层 |阅读模式
python 中的thread的一些机制:python 主线程结束后,会默认等待子线程结束后,主线程才退出。
  1. #coding=utf-8
  2. import threading
  3. from time import ctime,sleep

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

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


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

  17. if __name__ == '__main__':
  18.         for t in threads:
  19.                 #t.setDaemon(True)
  20.                 t.start()
  21.         #t.join()
  22.         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
[Finished in 10.1s]

主线程 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也杀死。

  1. if __name__ == '__main__':
  2.         for t in threads:
  3.                 t.setDaemon(True)
  4.                 t.start()
  5.         #t.join()
  6.         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
[Finished in 0.1s]

all over Mon Mar 13 11:56:38 2017 主线程结束后,不在有输出
如果想让子线程运行完毕,那么添加join方法。
  1. if __name__ == '__main__':
  2.         for t in threads:
  3.                 t.setDaemon(True)
  4.                 t.start()
  5.         t.join()
  6.         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
[Finished in 10.1s]




回复

使用道具 举报

 楼主| 发表于 2017-3-13 12:00:51 | 显示全部楼层
总结:
实际上就是,多线程,你不加setDaemon和join方法,那么主线程结束后,子线程会继续运行。
如果你加了setDaemon方法,那么主线程结束后,就直接杀死子线程
如果你想让子线程运行完毕,那么你加了setDaemon方法,再加个join方法,那么子线程结束后,才会会继续执行后面的主线程。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|女黑客 |网站地图

© Copyright 2021 版权所有(一极教育科技有限公司)

津ICP备17008032号-3
快速回复 返回顶部 返回列表