python如何在所有线程结束后执行最后操作_Python线程的生命周期

在线程的生命周期中,从创建到执行以及最终终止,线程通常处于四种状态之一:开始态、可调度状态、阻塞态和终止态。

父线程和子线程

当一个新的进程或程序开始运行时,它将以一个线程开始,这个线程被称为主线程。然后主线程可以启动或生成其他线程,这被称为子线程,它们同样是进程的一部分,但独立执行其他任务。如果需要,这些线程还可以生成自己的子线程,当每个线程完成执行时,将通知它们的父线程,最后主线程终止整个任务。父线程和子线程关系如下图所示:

线程的四种基本状态

不同的编程语言可能会使用不同的名称,并且还有一些额外的名称,但通常在线程的生命周期中,从创建到执行以及最终终止,线程通常处于四种状态:开始态、可调度态、阻塞态和终止态。开始态:主线程需要产生或创建另一个线程来辅助完成整个任务,子线程将以新状态开始,Python语言要求在创建线程后显式启动它。

可调度态:处于可运行状态,这意味着操作系统可以安排资源调度执行。通过上下文与其他线程交换,以便在处理器上运行。

阻塞态:当线程需要等待事件发生时,如外部输入或计时器,或者调用子线程的join()方法进入阻塞状态,当进入阻塞态时,线程不会使用任何CPU资源。

终止态:线程在完成执行或异常中止时进入终止状态。

线程的状态转换如下图所示:

线程生命周期示例

线程的定义有两种方式,分别是函数方式和类定义方式。函数方式在创建新线程时为它分配一个函数,即它将要执行的代码,我们在前面的课程中已经介绍过了,感兴趣的读者请参阅《一个Python多线程运行实例》。本文演示Python线程的生命周期将使用class方式来定义线程,具体代码如下:

#!/usr/bin/env python3

""" Two threads cooking soup """

import threading

import time

class ChefOlivia(threading.Thread):

def __init__(self):

super(ChefOlivia, self).__init__()

def run(self):

print('Olivia started & waiting for sausage to thaw...')

time.sleep(3)

print('Olivia is done cutting sausage.')

# main thread a.k.a Barron

if __name__ == '__main__':

print("Barron started & requesting Olivia's help.")

olivia = ChefOlivia()

print(" Olivia alive?", olivia.is_alive())

print("Barron tells Olivia to start.")

olivia.start()

print(" Olivia alive?", olivia.is_alive())

print("Barron continues cooking soup.")

time.sleep(0.5)

print(" Olivia alive?", olivia.is_alive())

print("Barron patiently waits for Olivia to finish and join...")

olivia.join()

print(" Olivia alive?", olivia.is_alive())

print("Barron and Olivia are both done!")

这个示例程序,模拟了Olivia和Barraon之间线程协作,Olivia需要帮助完成切片香肠,最后Brrraon完成做汤的算法。在Python中通过类创建线程需要定义一个继承threading.Thread类的子类,并且需要重载init和 run方法,在本例的init方法中,只需使用super函数执行父线程初始化即可。

首先Barron启动并请求Olivia的帮助,然后创建一个新的ChefOlivia对象。此时ChefOlivia还没有开始,Barron显示调用Olivia的start()方法启动子线程。然后Barron继续煮汤,并花费了0.5秒钟的时候。因为Olivia切香肠需要3秒钟时间,Barron会在其之前完成,为了最终完成整个做汤的任务,Barron会同步等待Olivia,通过调用join()方法,主线程进入阻塞状态,直到Olivia完成任务后,最后程序终止。

回到代码中,我们在控制台中运行此程序,同时加入了判断Olivia状态的打印语句,is_alive方法返回一个布尔值,指示该线程当前状态。最终打印结果输出如下:

$ python thread_lifecycle.py

Barron started & requesting Olivia's help.

Olivia alive? False

Barron tells Olivia to start.

Olivia started & waiting for sausage to thaw...

Olivia alive? True

Barron continues cooking soup.

Olivia alive? True

Barron patiently waits for Olivia to finish and join...

Olivia is done cutting sausage.

Olivia alive? False

Barron and Olivia are both done!

注意Olivia的线程在最初创建后并没有启动,状态显示是False,需要Barron线程显示调用start方法,之后线程状态显示存活。Olivia的线程正sleeping时,Python认为子线程状态仍然是存活的。Olivia调用join,主线程进入阻塞,并等待子线程其完成,Olivia运行完成,主线程继续执行,直至整个程序结束。整个程序的生命周期状态如下图所示:

结束语

本文介绍了主线程和子线程的关系,以及线程在操作系统中的四种基本状态,讲解了除了使用函数定义线程之外,使用class定义子线程的方法,最后展示了一个线程的生命周期代码实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac怎么安装python开发环境搭建_Mac OS搭建Python开发环境

简书 Wwwwei转载请注明原创出处,谢谢!前言最近在看一些关于机器学习的内容,其中大量代码需要Python的运行环境,所以搭建了Python开发环境,这里记录下,方便大家学习。安装PythonMac OS下安装Python主要方式有…

文本图形处理(扭曲变形、增强等)的源代码列表-1

文本图形扭曲变形 Google:Document image dewarping GitHub Document image dewarping using text-lines and line Segments https://github.com/taeho-kil/Document-Image-Dewarping Document Dewarping with Control Points https://github.com/gwxie/Document-Dewarping…

python小数补0,python用零填充小数

Im looking for a way to pad the float decimals with zeros:This one is my reference:In [37]: {:5.5}.format(round(4.123456, 5))Out[37]: 4.1235I have this:In [38]: {:5.5}.format(4.1)Out[38]: 4.1But I would like to have this:Out[38]: 4.1000解决方案To format a…

通讯可以并联吗_工业控制知识:吃透RS485通讯的连接方式,接485总线就简单多了...

RS485被广泛使用,可以支持ModBus协议。由于其简单、价优、可靠和成熟,因此,被广泛应用于工业控制、智能仪器和电力通信。我们来看看RS485的一个典型组网结构:理论上,RS485总线的传输距离可以达到1200米。然而&#xff…

python列表添加元素的三种方法定义集合数据对象_(1) List,tuple,dictionary,Python语法基础集,一,之,列表,元组,字典,集合...

Python序列(列表、元组、字典、集合) 一、列表(List)与列表推导式 (一)列表(list) 1.列表是Python内置 可变序列 (列表中元素可增加删除或修改); …

vue如何获取tree当前选中的节点_vue中element-ui 树形控件-树节点的选择(选中当前节点,获取当前id并且获取其父级id)...

出处:Element-ui官网给的方法getCheckedKeys() { console.log(this.$refs.tree.getCheckedKeys()); },1这种只有在所有子级都被选中的情况下才能获得父级的id,如果不选中所有的子级那么获取得到的id就只有子级的。但是一般提交数据时后台都需要父级id的。…

nodejs操作sqlserver数据_nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例...

本文实例讲述了nodejs基于mssql模块连接sqlserver数据库的简单封装操作。分享给大家供大家参考,具体如下:注意:开启sqlserver服务器允许远程连接的步骤,自行百度,很多经验,nodejs连接sqlserver,最好把防火墙的入站规则关闭,或者允许入站.这个封装只是sql…

python解压_python解压

Python 的代码块不使用大括号( {} )来控制类,函数以及其他 逻辑判断。 python 最具特色的就是用缩进来写模块。 缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。 Python 语句…

python编程a的x次方_「Python 面试」第四次更新

阅读本文大约需要 5 分钟。 15.说一说 GIL 前面有提到由于 Python 基于 C 语言编写的解释器中设置了一个 GIL 全局变量锁,该锁使得 Python 的多线程在处理 CPU 计算密集型任务时,同一时刻只能有一个线程在运行,这也是为什么说 Python 的多线程…

Exploiting Vector Fields for Geometric Rectification of Distorted Document Images学习笔记

1 广告 [1] Exploiting Vector Fields for Geometric Rectification of Distorted Document Images 利用矢量场对变形文档图像进行几何校正。 2018年发表在ECCV会议上的一篇非深度学习的文档去扭曲。 本文提出了一种对手持相机捕获的扭曲文档图像进行几何校正的无分段方法。…

java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

往期文章「Java并发编程」谈谈Java中的内存模型JMM面试官:说说你知道多少种线程池拒绝策略为什么不要在MySQL中使用UTF-8编码方式前言很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标&…

文本图形处理(扭曲变形、增强等)的源代码列表-2

1 基于深度学习的文档扭曲矫正 Dewarping Document Image By Displacement Flow Estimation with Fully Convolutional Network https://github.com/gwxie/Dewarping-Document-Image-By-Displacement-Flow-Estimation Here are 12 public repositories matching this topic……

java编译_解析 Java 即时编译器原理。

↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!一、导读常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成…

ios nsstring根据ascii码大小排序_iOS(NSPredicate) 谓词的使用

参考iOS-谓词的使用详解NSPredicate 谓词NSPredicateA definition of logical conditions used to constrain a search either for a fetch or for in-memory filtering.一种逻辑条件的定义,可以根据定义的模糊查询条件,对内存对象进行过滤搜索。1.比较运…

恒位油杯故障原因_抽油烟机常见故障及处理方法

您知道抽油烟机常见故障及处理方法是什么吗?抽油烟机通电后不能启动,可能是因为电源线断路或接头脱焊,仔细查出断路点或脱焊点,重新焊牢。通断开关断路或触点接触不良,检查断路器处是否焊好,若触点接触不良…

会议容易中吗_在装配式建筑中重要又容易被忽视的部分,你中招了吗?

装配式 建筑装配式建筑大家应该都有听过,那么这种建筑又是怎样构成的呢?装配式建筑概览▲▲▲装配式建筑粘结方案▲▲▲密封胶作为装配式建筑中的重要材料,起到不可忽视的作用~SMP密封胶,1978年开始生产,最初是针对硅酮…

Document image dewarping using text-lines and line Segments学习笔记

1 核心思想 论文:Robust Document Image Dewarping Method Using Text-Lines and Line Segments 论文:Document Dewarping via Text-line based Optimization 代码:https://github.com/taeho-kil/Document-Image-Dewarping 传统的基于文本行的文档去扭曲方法在处理复杂布局…

官网mysql安装目录_官网下载MySQL 并安装

官网下载MySQL 并安装一、下载二、安装:这里不再叙述安装步骤三、MySQL环境变量配置不是必须的。MySQL环境变量作用:找到MySQL安装目录下的bin目录,才能使用MySQL相关命令。配置环境变量后就不必找到bin目录了。说到这里解释一下Java &#x…

ai二维码插件_送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用...

送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用。(领取方式见文章末尾)【AI脚本插件合集包】此AI插件包目前有66款ai脚本插件,已经整合成插件面板的形式,方便在AI中调用。软件内置刀模线绘制、二维码生成、条码制作…

ai圆角插件_【干货满满】AI软件技巧排版所需

今天给大家来一期关于AI软件的技巧,在画图的速度上能有所提升。下面是软件技巧。#1、在ai中,如何让文件背景是透明的?答:ctrl shift d2、在ai中,如何像快速放大缩小编辑区域?答:按住alt滚动鼠标…