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)的更多相关文章

  1. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  2. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Python模块学习------ 多线程threading(2)

    一.避免使用thread模块,使用threading模块的原因: 1. 更高级别的threading模块更为先进,对线程的支持更加完善.而且使用thread模块的属性有可能会与threading 出现 ...

  4. Python多线程的创建,相关函数和守护线程的理解

    一:多线程的创建 threading库创建线程有两种方式,函数式和继承式    1)函数式 def func(): print 'Starting' print 'Ending' t=threadin ...

  5. Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程

    一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...

  6. 第三十三天- 线程创建、join、守护线程、死锁

    1.线程,线程创建 概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责 ...

  7. 网络编程 - join及守护线程

    一.Join实例(join理解为等待)import threading,timedef run(n): time.sleep(3) print ("task",n)start = ...

  8. Python核心编程——多线程threading和队列

    线程与进程类似不过他们是在同一个进程下执行的,并共享相同的上下文.可以将他们认为是在一个主进程或“主线程”中运行的迷你进程. 线程包括开始.执行顺序和结束三部分.它有一个指令指针,用于记录当前运行的上 ...

  9. python笔记12-python多线程之事件(Event)

    前言 小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现 Event(事件) Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果 ...

随机推荐

  1. Windows 环境搭建Redis集群

    环境以及引用资料 1.windows server 2008 r2 enterprise  (木有办法,公司的服务器全是如此,就这种环境搭建吧) 2.redis官方资料下载: https://redi ...

  2. js 动态设置 option 的selected 选项

    思路:通过for循环判断每个选项,一旦满足条件则设置其selected属性为true即可,关键代码: var obj = document.getElementById(select_id); for ...

  3. JavaStuNote 5

    接口 (interface) 一个抽象类,全部的方法都是抽象的,全部方法的public, 我们把这种类叫做极度抽象类,是最干瘪的类. public abstract class A { public  ...

  4. 【C++基础 05】友元函数和友元类

    友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...

  5. VS------修改项目命名空间

    1.以文本形式打开此文件 2.修改一下部分 3.vs会自动提示,选择“放弃”即可

  6. 南京IT企业环境之最深心得体会

    我是南京做嵌入式的. 之前搞过一年的PC平台Linux内核开发,Linux内核态的仅仅要不是非常复杂的BUG还是能修复的.一年的Linux用户态软件开发. 然后近期搞了两年ARM嵌入式开发. 做的CM ...

  7. Mysql课后思考题

    1.请简述数据库.表和数据库服务器之间的关系? 知识点数据库存储结构 一个数据库服务器可以管理多个数据库,通常情况下开发人员会针对每个应用创建一个数据库,为保存应用中实体的数据,会在数据库中创建多个表 ...

  8. day22<IO流+>

    IO流(序列流) IO流(序列流整合多个) IO流(内存输出流) IO流(内存输出流之黑马面试题) IO流(对象操作流ObjecOutputStream) IO流(对象操作流ObjectInputSt ...

  9. Java精选笔记_面向对象(构造方法、this关键字、static关键字、内部类)

    构造方法constructor构造器 构造方法的定义 [修饰符]  类名 (形式参数列表){         //语句 } 构造器用于构造该类的实例.作用:用来初始化对象!一般由系统在创建对象(即类的 ...

  10. swift--获取window

    有时候,我们需要频繁的调用界面,然后给当前页面加一个跟视图,这个时候就需要找windown, 代码如下: let rootVC = UIApplication.shared.delegate as! ...