在科普什么是setDaemon和join之前,首先得明白进程与线程的概念。简而言之:代码在运行时,在内存中开辟了一个空间来运行这个代码块,在电脑的任务管理器可以进行查看,而这个代码在运行的时候,可能不止一个主线程在运行,也有可能出现多线程运行的情况。线程是一个顺序执行流,它是进程的组成部分,一个进程可以拥有多个线程。每个子线程和该父线程共享该进程的内存空间。

那么在python中如何调用多线程呢?python给我们提供了threading和_thread两个库,threading对_thread提供了封装。在threading模块中提供了Thread、Lock、RLock、Condition等组件。那么我们要提到的setDaemon和join两个方法。

首先了解以下join方法:阻塞线程,主线程进行等待。各位看官自己翻译,能力有限。

        """Wait until the thread terminates.This blocks the calling thread until the thread whose join() method iscalled terminates -- either normally or through an unhandled exceptionor until the optional timeout occurs.When the timeout argument is present and not None, it should be afloating point number specifying a timeout for the operation in seconds(or fractions thereof). As join() always returns None, you must callisAlive() after join() to decide whether a timeout happened -- if thethread is still alive, the join() call timed out.When the timeout argument is not present or None, the operation willblock until the thread terminates.A thread can be join()ed many times.join() raises a RuntimeError if an attempt is made to join the currentthread as that would cause a deadlock. It is also an error to join() athread before it has been started and attempts to do so raises the sameexception."""

使用方法如下:定义了一个def,里面print两句话,并且使用sleep使两句话中间间隔时间为3秒,main函数调用该def,并定义其为一个子线程,最后在主线程前调用该子线程。

import threading
import timedef f():print("子线程1")time.sleep(3)print("子线程1运行结束")if __name__ == '__main__':# 定义一个子线程use = threading.Thread(target=f)# 调用子线程use.start()# 阻塞调用,主线程等待use.join()print("程序运行结束")

其输出结果为:(第一句和第二句中间间隔了3秒后,由于使用join方法,阻塞调用,使主线程等待子线程执行完毕后。顺序执行主线程,打印第三句后进程执行完毕)

子线程1
子线程1运行结束
程序运行结束

我们现在来讨论setDaemon这个方法,此方法是将子线程设置为守护线程。setDaemon放在start方法之前,可以理解为先设置完后再进行调用。其中括号中可以填写True 或者False,先讲解True。

import threading
import timedef f():print("子线程1")time.sleep(3)print("子线程1运行结束")if __name__ == '__main__':# 定义一个子线程use = threading.Thread(target=f)# 将子线程设置为守护线程use.setDaemon(True)# 调用子线程use.start()print("程序运行结束")

运行结果:(既然设置了守护线程,主线程就不会像join方法一样等你子线程执行完毕后,在开始执行,它直接先行执行,然后你子线程才被开始调用。其中子线程的调用还是:先打印第一句话后,睡3秒,执行打印第二句话)

程序运行结束
子线程1
子线程1运行结束

在setDaemon参数中设置为False。其结果为:

子线程1
程序运行结束
子线程1运行结束

由于setDaemon(False)为单线程,代码从main进入,从上而下顺序执行,到了start方法,调用函数,调用子线程打印第一句话,后主线程抢回线程,原因是子线程睡了3秒,主线程执行完毕后,最后在返回子线程执行最后的打印。

假如子线程不睡,其结果又是怎么样的呢?

import threading
import timedef f():print("子线程1")# time.sleep(3)print("子线程1运行结束")if __name__ == '__main__':# 定义一个子线程use = threading.Thread(target=f)# 将子线程设置为守护线程use.setDaemon(False)# 调用子线程use.start()print("程序运行结束")"""
子线程1
程序运行结束
子线程1运行结束
"""

子线程没有睡,则结果如下:(为了观察加了一个range观察调用情况)

import threading
import timedef f():print("子线程1")# time.sleep(3)print("子线程1运行结束")for i in range(5):print(i)if __name__ == '__main__':# 定义一个子线程use = threading.Thread(target=f)# 将子线程设置为守护线程use.setDaemon(False)# 调用子线程use.start()print("程序运行结束")'''
子线程1
子线程1运行结束
0
1
2
程序运行结束
3
4
'''

结果显示:子线程没有睡后,主线程会与子线程竞争线程的使用权,其运行结果不定。但是调用子线程的第一句话还是第一句(子线程1),而主线程(程序运行结束)的打印位置会发生变化。

以上为本人的理解,如有错误请留言纠正,谢谢。

setDaemon和join区别相关推荐

  1. 【Hive】left semi join(exists、in)和 left join 区别

    left semi join(exists.in)和 left join 区别 left semi join 基本认识 对比 执行计划 小结 left semi join 基本认识 LEFT SEMI ...

  2. ​left join 和 left semi join区别 ​

    左连接与+号, 就是左边的表数据都要. select * from a,b where a.id=b.id(+); (+)写在where后面,不能与or/in连用,ui select * from a ...

  3. python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join配有GIF示意

    在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...

  4. python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...

  5. mysql sql left right inner join区别及效率比较

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  6. python中thread的setDaemon、join的用法

    From: http://doudouclever.blog.163.com/blog/static/17511231020127232303469/ python中得thread的一些机制和C/C+ ...

  7. mysql连接方式左联_数据库中的左连接(left join)和右连接(right join)区别 | 改变自己...

    Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...

  8. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

  9. sql join on和不用join区别_图解 SQL 各种 JOIN,太有用了!

    点击上方蓝字关注小姐姐吧从业以来主要在做客户端,用到的数据库都是表结构比较简单的 SQLite,以我那还给老师一大半的 SQL 水平倒也能对付.现在偶尔需要到后台的 SQL Server 里追查一些数 ...

最新文章

  1. Java高级技术笔记
  2. 放苹果问题 POJ 1664
  3. android sd大小,android用户的SD卡相同容量是否完全一样的大小
  4. [转] JavaScript中的属性:如何遍历属性
  5. jeecg-framework 采用eclipse-maven运行
  6. 为什么很多人转行学习Web前端技术?
  7. 剑指Offer 和为S的两个数字
  8. 最大熵模型The Maximum Entropy:学习
  9. Java学习笔记(六)数据的操作(增、删、改的操作)
  10. STL两种格式:文本格式与二进制格式
  11. java中的POJO类
  12. 三天入门MySQL---DAY 1---库和表的创建、删除、更新
  13. MySQL数据查询---连接查询
  14. c语言有哪些系统函数,C语言常用系统函数.doc
  15. 关于Linux系统重启过慢问题解决方案
  16. Mysql error 1045的解决
  17. MySQL5.X二进制安装
  18. 第一次单车背包旅行,章丘百脉泉
  19. 用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味!
  20. IIS部署图片文件夹,采用HTTP协议可获取图片

热门文章

  1. 利用360tools-master进行计算S-PSNR,CPP-PSNR,WS-PSNR
  2. Echarts通过ajax获取数据定时更新轮询的解决方案及问题分析
  3. 微软投屏器 android,微软 Your Phone 新功能:可同时投屏多款 Android 应用
  4. GitHub获取Personal Access Tokens
  5. 竞选计算机课代表稿子,竞选数学课代表演讲稿精选五篇
  6. HDMI学习-1:基础知识
  7. sql去重,去重查询,去重删除
  8. 如何查看cpu是否支持sse指令级
  9. Spring-Boot-全栈开发:漂亮的邮件注册
  10. OCR测试—文字密度和中英文