简单介绍:线程是程序执行的一个最小单元,当开启多线程时,主线程会创建多个子线程,在python中,默认情况下主线程执行完自己的任务之后就会退出,子线程会继续执行自己的任务,直到自己的任务结束为止。

不设置线程守护(主线程), 默认是不守护主线程的(daemon=False)

import threading
from threading import currentThreaddef put_task():print(f'{currentThread().name}---->开始输入任务...')time.sleep(1)print(f'{currentThread().name}---->完成输入任务...')def get_task():print(f'{currentThread().name}---->开始消费任务...')time.sleep(1)print(f'{currentThread().name}---->完成消费任务...')upload_thread = threading.Thread(target=put_task,name='子线程1')
upload_thread.start()download_thread = threading.Thread(target=get_task,name ='子线程2')
download_thread.start()
print('主线程执行到这里了!')

执行输出如下

子线程1---->开始输入任务...
子线程2---->开始消费任务...
主线程执行到这里了!
子线程2---->完成消费任务...
子线程1---->完成输入任务...
  • 在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。

  • 由执行输出顺序可知,主线程会先执行,然后子线程1执行遇到阻塞时会切换到子线程2去执行任务,同样当子线程2遇到阻塞时程序也会自动切换到子线程1去执行任务,如此交替直到任务被完成。

  • 主线程会先执行完, 但是并不意味着子线程会跟着主线程结束,主线程执行完以后, 默认等待子线程结束任务。

设置线程守护(daemon=True)

  • 守护线程,是为守护别人而存在,当设置为守护线程后,被守护的主线程不存在后,守护线程也自然不存在
import time
import threading
from threading import currentThreaddef put_task():print(f'{currentThread().name}---->开始输入任务...')time.sleep(1)print(f'{currentThread().name}---->完成输入任务...')def get_task():print(f'{currentThread().name}---->开始消费任务...')time.sleep(1)print(f'{currentThread().name}---->完成消费任务...')upload_thread = threading.Thread(target=put_task,name='线程1',daemon=True)
upload_thread.start()download_thread = threading.Thread(target=get_task,name ='线程2')
download_thread.setDaemon(True)
download_thread.start()
print('主线程执行到这里了!')

输出结果

线程1---->开始输入任务...
线程2---->开始消费任务...
主线程执行到这里了!
  • setDaemon(True): 当主线程退出时,后台子线程随机退出。
  • 随着主线程的终止而终止,不管当前主线程下有多少子线程没有执行完毕,都会终止。

join线程同步

  • 在Python多线程编程中,join方法的作用是线程同步
from queue import Queue
import threading
import timedef set_value(queue):for num in range(1,5):queue.put(num)print(f'输入了:{num}')time.sleep(1)queue.put(True)def get_value(queue):while True:value = queue.get()if value is True:breakprint(f"取出了:{value}")if __name__ == '__main__':queue = Queue(5)t1 = threading.Thread(target=set_value, args=(queue, ))t2 = threading.Thread(target=get_value, args=(queue, ))t1.start()t2.start()t1.join()t2.join()print('主线程执行到这里了!')

输出结果

输入了:1
取出了:1
输入了:2
取出了:2
输入了:3
取出了:3
输入了:4
取出了:4
主线程执行到这里了!
  • 主线程运行过程中,需要插入一个子线程,且子线程运行结束后,主线程才能继续运行或停止,此时方可用到join()方法

  • join()通俗地说就是是子线程告诉主线程,你要在设置join的位置等我执行完毕你再往下执行。

python多线程之setDaemon和join相关推荐

  1. Python多线程之gevent

    python多线程之gevent 因为python线程的性能问题,在python中使用多线程运行代码经常不能达到预期的效果.而有些时候我们的逻辑中又需要开更高的并发,或者简单的说,就是让我们的代码跑的 ...

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

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

  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. python多线程之threading

    一.创建线程的方法 1.用 thread.Thread 直接在线程中运行函数 import threading def threadfun(x,y): #线程任务函数 threadfun() for ...

  6. 白话理解java多线程之setDaemon()方法

    直接上例子: package cn.yh.thread01;/*** setDaemon 微信下载的例子 假如有一个线程,随着主程序存在而存在,停止而停止*/ public class Demo04 ...

  7. Java线程之setDaemon(true)方法的作用

    一.线程 JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个Illeg ...

  8. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  9. Python3——多线程之threading模块

    Python3--多线程之threading模块 目录 Python3--多线程之threading模块 Threading模块的对象 Threading模块的Thread类 queue模块(线程间通 ...

最新文章

  1. Mila唐建博士《图神经网络:算法与应用》研究进展
  2. CentOS 7 的初始化
  3. 疯狂ios讲义之网页控件(UIWebView)
  4. 杭电find the night
  5. C++学习笔记:(六)public、protected、private继承详解
  6. web前端开发,自学的流程可以怎样?
  7. 查询limit_MySQL查询语句(where,group by,having,order by,limit)
  8. jquery通过id或name获取标签的值,以及简单的js正则表达式
  9. libevent eventbuffer读写水位思考
  10. 【人工智能】人工智能是20世纪50年代中期兴起的一门新兴边缘科学
  11. 外卖点餐系统源码|餐饮点餐源码开发
  12. 模块化机房建设指导书_模块化机房建设方案.doc
  13. 观天利器-stellarium
  14. 认证授权那点事儿 —— OAuth 2.0
  15. CSS:颜色、背景和剪切
  16. 数学一英语二计算机考研真题,2018年考研(英语二)真题与答案解析(网络整理完整版)...
  17. 增长的旋律——AARRR模式思考(二)
  18. 网络数据传输、网络安全与通信
  19. 数组反转,Java实现
  20. mc服务器怎么传送到我位置,我的世界联机怎么传送到队友身边_我的世界联机怎么传送到队友位置哪里身边手机版_攻略...

热门文章

  1. 基于SQLserver实现的医药销售管理系统
  2. 这个外包公司太恶心了。。
  3. splay tree java_伸展树(splay tree)自顶向下的算法
  4. 2014年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题
  5. 长尾关键词的挖掘与分析
  6. php 动力环境监控,机房动力环境监控系统
  7. 输入一个0~6的整数,输出星期几
  8. QT程序图标和窗口图标
  9. php 如何使用openssl_encrypt进行aes非对称加密解密
  10. 一种随机生成加密盐值的方法