python多线程之setDaemon和join
简单介绍:线程是程序执行的一个最小单元,当开启多线程时,主线程会创建多个子线程,在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相关推荐
- Python多线程之gevent
python多线程之gevent 因为python线程的性能问题,在python中使用多线程运行代码经常不能达到预期的效果.而有些时候我们的逻辑中又需要开更高的并发,或者简单的说,就是让我们的代码跑的 ...
- python中thread的setDaemon、join的用法
From: http://doudouclever.blog.163.com/blog/static/17511231020127232303469/ python中得thread的一些机制和C/C+ ...
- python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join配有GIF示意
在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...
- python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...
- python多线程之threading
一.创建线程的方法 1.用 thread.Thread 直接在线程中运行函数 import threading def threadfun(x,y): #线程任务函数 threadfun() for ...
- 白话理解java多线程之setDaemon()方法
直接上例子: package cn.yh.thread01;/*** setDaemon 微信下载的例子 假如有一个线程,随着主程序存在而存在,停止而停止*/ public class Demo04 ...
- Java线程之setDaemon(true)方法的作用
一.线程 JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个Illeg ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- Python3——多线程之threading模块
Python3--多线程之threading模块 目录 Python3--多线程之threading模块 Threading模块的对象 Threading模块的Thread类 queue模块(线程间通 ...
最新文章
- Mila唐建博士《图神经网络:算法与应用》研究进展
- CentOS 7 的初始化
- 疯狂ios讲义之网页控件(UIWebView)
- 杭电find the night
- C++学习笔记:(六)public、protected、private继承详解
- web前端开发,自学的流程可以怎样?
- 查询limit_MySQL查询语句(where,group by,having,order by,limit)
- jquery通过id或name获取标签的值,以及简单的js正则表达式
- libevent eventbuffer读写水位思考
- 【人工智能】人工智能是20世纪50年代中期兴起的一门新兴边缘科学
- 外卖点餐系统源码|餐饮点餐源码开发
- 模块化机房建设指导书_模块化机房建设方案.doc
- 观天利器-stellarium
- 认证授权那点事儿 —— OAuth 2.0
- CSS:颜色、背景和剪切
- 数学一英语二计算机考研真题,2018年考研(英语二)真题与答案解析(网络整理完整版)...
- 增长的旋律——AARRR模式思考(二)
- 网络数据传输、网络安全与通信
- 数组反转,Java实现
- mc服务器怎么传送到我位置,我的世界联机怎么传送到队友身边_我的世界联机怎么传送到队友位置哪里身边手机版_攻略...