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. Linux /proc/loadavg(平均负载)

    from : http://hi.baidu.com/mengyun8/blog/item/bd424531451b98e71a4cffc0.html 一.什么是系统平均负载(Load average ...

  2. jquery插件大全

    241个jquery插件—jquery插件大全 免费JQuery插件 推荐12款非常有用的流行 jQuery 插件

  3. hdu 5038 水题 可是题意坑

    http://acm.hdu.edu.cn/showproblem.php?pid=5038 就是求个众数  这个范围小 所以一个数组存是否存在的状态即可了 可是这句话真恶心  If not all ...

  4. Extjs学习笔记--(二)

    1.配置实用Extjs <link href="Extjs/resources/css/ext-all.css" rel="stylesheet" /&g ...

  5. wsdl.exe的用法与参数说明

    wsdl.exe的用法与参数说明 打开.net自己带的Visual Studio .NET 2003或 2005 命令提示 输入 wsdl /language:VB /n:mynamespace /o ...

  6. Objective-C语法之字符串NSString

    Objective-C里核心的处理字符串的类就是NSString和 NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理.这两个类的最主要的区别是NSS ...

  7. 查看内存使用情况:free

    free命令用于显示内存的使用情况,常见用法如下: [root@localhost ~]$ free # 以KB为单位显示内存使用情况 [root@localhost ~]$ free -m # 以M ...

  8. N32903系列的基础知识(1)

    N32903U1DN使用ARM926EJ-S内核,其内部集成的JPEG编解码器.CMOS摄像头接口.32通道的声音处理单元(SPU).ADC.DAC等不仅可以满足各种的应用需求,还能减少生产方面的物料 ...

  9. Linux 文件基本属性(转)

    Linux 文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规 ...

  10. C++异常 调用abort()

    以一个计算两个数的调和平均数的函数为例.两个数的调和平均数的定义是:这两个数倒数的平均值的倒数,因此表达式为:1.0 * x * y / (x + y)如果y是x的负值,则上述公式将导致被零除——一种 ...