python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
前言
今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景:
- 场景一:小编(主)先吃完了,xiaoming(客)和xiaowang(客)还没吃完,这种场景会导致结账的人先走了,剩下两个小伙伴傻眼了。。。
- 场景二:小编(主)先吃完了,xiaoming和xiaowang还没吃饱,一起结账走人。
- 场景三:小编(主)先等xiaoming和xiaowang吃饱了,小编最后结账一起走人。
一、 主线程与子线程
场景一:主线程已经结束了,子线程还在跑
1.我们把thread1.start()和thread2.start()称为两个子线程,写在外面的代码就是主线程了。
```
# coding=utf-8
import threading
import time
def chiHuoGuo(people):
print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))
time.sleep(1)
print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))
class myThread (threading.Thread): # 继承父类threading.Thread
def __init__(self, people, name):
'''重写threading.Thread初始化内容'''
threading.Thread.__init__(self)
self.threadName = name
self.people = people
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
'''重写run方法'''
print("开始线程: " + self.threadName)
chiHuoGuo(self.people) # 执行任务
print("qq交流群:226296743")
print("结束线程: " + self.name)
print("yoyo请小伙伴开始吃火锅:!!!")
# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")
# 开启线程
thread1.start()
thread2.start()
time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")
```
2.运行结果:

二、 守护线程setDaemon()
场景二:主线程结束了,子线程必须也跟着结束
1.主线程中,创建了子线程thread1和thread2,并且在主线程中调用了thread.setDaemon(),这个的意思是,把主线程设置为守护线程,这时候,要是主线程执行结束了,就不管子线程是否完成,一并和主线程退出.
(敲黑板:必须在start()方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。)
2.线程有一个布尔属性叫做daemon。表示线程是否是守护线程,默认取否。当程序中的线程全部是守护线程时,程序才会退出。只要还存在一个非守护线程,程序就不会退出。
主线程是非守护线程。
3.setDaemon(True)此方法里面参数设置为True才会生效
```
# coding=utf-8
import threading
import time
def chiHuoGuo(people):
print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))
time.sleep(1)
print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))
class myThread (threading.Thread): # 继承父类threading.Thread
def __init__(self, people, name):
'''重写threading.Thread初始化内容'''
threading.Thread.__init__(self)
self.threadName = name
self.people = people
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
'''重写run方法'''
print("开始线程: " + self.threadName)
chiHuoGuo(self.people) # 执行任务
print("qq交流群:226296743")
print("结束线程: " + self.name)
print("yoyo请小伙伴开始吃火锅:!!!")
# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")
# 守护线程setDaemon(True)
thread1.setDaemon(True) # 必须在start之前
thread2.setDaemon(True)
# 开启线程
thread1.start()
thread2.start()
time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")
```
4.运行结果:

三、 阻塞主线程join(timeout)
1.如果想让主线程等待子线程结束后再运行的话,就需要用到join(),此方法是在start之后(与setDaemon相反)
2.join(timeout)此方法有个timeout参数,是线程超时时间设置。
```
# coding=utf-8
import threading
import time
def chiHuoGuo(people):
print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))
time.sleep(1)
print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))
class myThread (threading.Thread): # 继承父类threading.Thread
def __init__(self, people, name):
'''重写threading.Thread初始化内容'''
threading.Thread.__init__(self)
self.threadName = name
self.people = people
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
'''重写run方法'''
print("开始线程: " + self.threadName)
chiHuoGuo(self.people) # 执行任务
print("qq交流群:226296743")
print("结束线程: " + self.name)
print("yoyo请小伙伴开始吃火锅:!!!")
# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")
# 开启线程
thread1.start()
thread2.start()
# 阻塞主线程,等子线程结束
thread1.join()
thread2.join()
time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")
```
运行结果:

四、 参考代码:
```
# coding=utf-8
import threading
import time
def chiHuoGuo(people):
print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))
time.sleep(1)
print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))
class myThread (threading.Thread): # 继承父类threading.Thread
def __init__(self, people, name):
'''重写threading.Thread初始化内容'''
threading.Thread.__init__(self)
self.threadName = name
self.people = people
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
'''重写run方法'''
print("开始线程: " + self.threadName)
chiHuoGuo(self.people) # 执行任务
print("qq交流群:226296743")
print("结束线程: " + self.name)
print("yoyo请小伙伴开始吃火锅:!!!")
# 设置线程组
threads = []
# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")
# 添加到线程组
threads.append(thread1)
threads.append(thread2)
# 开启线程
for thread in threads:
thread.start()
# 阻塞主线程,等子线程结束
for thread in threads:
thread.join()
time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")
python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)的更多相关文章
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Python模块学习------ 多线程threading(2)
一.避免使用thread模块,使用threading模块的原因: 1. 更高级别的threading模块更为先进,对线程的支持更加完善.而且使用thread模块的属性有可能会与threading 出现 ...
- Python多线程的创建,相关函数和守护线程的理解
一:多线程的创建 threading库创建线程有两种方式,函数式和继承式 1)函数式 def func(): print 'Starting' print 'Ending' t=threadin ...
- Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程
一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...
- 第三十三天- 线程创建、join、守护线程、死锁
1.线程,线程创建 概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责 ...
- 网络编程 - join及守护线程
一.Join实例(join理解为等待)import threading,timedef run(n): time.sleep(3) print ("task",n)start = ...
- Python核心编程——多线程threading和队列
线程与进程类似不过他们是在同一个进程下执行的,并共享相同的上下文.可以将他们认为是在一个主进程或“主线程”中运行的迷你进程. 线程包括开始.执行顺序和结束三部分.它有一个指令指针,用于记录当前运行的上 ...
- python笔记12-python多线程之事件(Event)
前言 小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现 Event(事件) Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果 ...
随机推荐
- Win10開始菜单打不开
一.前言 自从用Win10之后(附上<我的Win10之旅>).用清理软件.总是深度清理,导致rt问题. 每次百度都是没用的解决方法: 今天,再一次清理(Wise Care 365 注冊表深 ...
- eclipse 远程链接访问hadoop 集群日志信息没有输出的问题l
Eclipse插件Run on Hadoop没有用到hadoop集群节点的问题参考来源 http://f.dataguru.cn/thread-250980-1-1.html http://f.dat ...
- Hadoop参数汇总
linux参数 以下参数最好优化一下: 文件描述符ulimit -n 用户最大进程 nproc (hbase需要 hbse book) 关闭swap分区 设置合理的预读取缓冲区 Linux的内核的IO ...
- 织梦DedeCMS使用SQL批量替换文章标题内容
在使用织梦DedeCMS的过程中,出于伪原创或者其他的原因,我们需要对文档的内容.标题.描述等等进行同义词或者其他的替换.这个就是一个简单的织梦SQL语句操作的问题,No牛网在织梦DedeCMS常用S ...
- oracle 存储过程 where in参数传入问题
问题: 举个简单例子说明create or replace procedure procStr(inString in varchar2)asbeginselect * from book where ...
- Linux select 机制深入分析
Linux select 机制深入分析 作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...
- 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean
7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...
- THINKPHP include 标签动态加载文件
有时候需要在框架中动态的加载一些文件,文件名不确定,有控制器获取得到,想在模板中使用变量的形式进行加载,本以为这样写可以 结果不行 <include file="User/{$my_t ...
- Access数据操作-02
数据库连接 MDB文件 :Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb ;Persist Security Info=False; AccDB文 ...
- python使用sqlalchemy连接pymysql数据库
python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...