当前位置: 首页 > news >正文

【Python】3.3实现多线程

程序Program

进程Process

线程Thread

为完成特定任务而用计算机语言编写的一组计算机能识别和执行的指令的集合。程序是指令、数据及其组织形式的描述,一段静态代码,静态对象。

计算机中的程序关于某数据集合上的一次执行过程。进程是程序的实体,是动态的过程。

是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

操作系统能够进行独立运行和调度的最小单位。线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。

线程类似于同时执行多个不同的程序,多线程运行有如下优点

  • 防止线程堵塞,使用线程可以把占据长时间的程序中的任务放到后台去处理。

  • 程序的运行速度可能加快

  • 在一些等待的任务如:用户输入、文件读写和网络收发数据等, 可以释放一些珍贵的资源如内存占用等等,提高资源利用率

  • 增强用户体验,用户不会看到进程卡死,用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。

  • 每个线程都有自己的一组 CPU 寄存器,称为线程的上下文,该上下文反应课线程上次运行该线程的CPU 寄存器的状态。

  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠),这就是线程的退让

多线程的缺点

  • 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换

  • 更多的线程需要更多的内存空间

  • 线程可能会给程序带来更多“bug”,因此要小心使用 。

  • 线程的中止需要考虑其对程序运行的影响

  • 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生 。

线程状态转换图

  1. Python 的前后台线程


前台线程:应用程序必须运行完所有的前台线程才可以退出;

后台线程:应用程序则可以不考虑其是否已经运行完毕而直接退出,

所有的后台线程在应用程序退出时都会自动结束。

setDaemon(True): 设置后台线程守护线程,也称为服务线程,是运行在后台的一种特殊线程(Daemon:守护线程、后台线程)。当程序没有可服务的线程会自动离开。即当主线程退出时,后台线程随即退出。因此,守护线程的优先级比较低,用于为其他线程提供服务
setDaemon(False)(默认情况):非守护线程,也称为前台线程当主线程退出时,若前台线程还未结束,则等待所有前台线程结束,相当于在程序末尾加入join()
  • 主进程来说,运行完毕指的是主进程代码运行完毕。

  • 主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕。


若在父线程中创建了子线程,当父线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:

(1)如果某个子线程的daemon属性为False,父线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;
(2)如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。


在Python中要启动一个线程,可以使用threading包中的Thread 建立一个对象,这个Thread类的基本原型是:

t=Thread(target,args=None)
  • 其中target是要执行的线程函数,

  • args是一个元组或者列表,为target的函数提供参数,

  • 然后调用t.start()就开始了线程。


在主线程中启动一个前台线程执行reading函数

import threading
import time
import randomdef reading():for i in range(5):print("reading", i)time.sleep(random.randint(1, 2))r = threading.Thread(target=reading)
r.setDaemon(False)  # 前台线程,非守护线程
# r.daemon = False  # 另一种写法
r.start()
print("The End")

程序结果如下:

从结果看到,主线程启动子线程r后就结束了,输出“The End”,但是子线程还没有结束, 继续显示完reasing 4后才结束。其中的r.setDaemon(False)就是设置线程r为前台线程,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出。(注意:没有设置线程的等待,结果可能不理想,因为根本不知道程序会先执行那行代码(主线程与子线程几乎同时运行))


启动一个后台线程

import threading
import time
import randomdef reading():for i in range(5):print("reading", i)time.sleep(random.randint(1, 2))r = threading.Thread(target=reading)
r.setDaemon(True)  # 后台线程,守护线程
r.start()
print("The End")  # 后台线程因主线程的结束而结束

运行结果如下:

还有很多种结果,原因见前台线程里的注意

由此可见在主线程结束后子线程也结束,这就是后台线程。

如果设置 r.setDaemon(True),那么r就是后台线程,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

前台与后台线程

# 前台与后台线程
import threading
import time
import randomdef reading():for i in range(5):print("reading", i)time.sleep(random.randint(1, 2))def test():r = threading.Thread(target=reading)r.setDaemon(True)  # 后台r.start()print("the end")t = threading.Thread(target=test)
t.daemon = False  # 另一种写法  前台
t.start()
print("The End")

运行结果如下:

这就是没有线程等待的可怕之处,可能还有很多不同的结果

由此可见主线程启动前台子线程t后,主程序执行完毕输出“The End”,但是前台线程t还在执行,在t中启动后台r子线程,之后t程序结束,输出“test end” t线程结束,相应的r线程也结束,此时主线程才最终结束。(按第一个结果(正常结果)来说明),这里没必要深究,学完下面的 join()就不会出现这些问题了。

  1. 线程的等待


持续更新中

  1. 多线程与资源


相关文章:

【Python】3.3实现多线程

程序Program进程Process线程Thread为完成特定任务而用计算机语言编写的一组计算机能识别和执行的指令的集合。程序是指令、数据及其组织形式的描述,一段静态代码,静态对象。计算机中的程序关于某数据集合上的一次执行过程。进程是程序的实体,…...

在linux中使用lftp和sftp下载文件(夹)

一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中,一般RedHat系统默认已经安装了openssh-client和openssh-server,即默认已经集成了sftp服务,不需要重…...

Docker简介与用法

文章目录1、Docker简介1.1、Docker能解决什么问题1.2、什么是虚拟机技术1.2.1、虚拟机的缺点1.3、什么是容器1.3.1、容器与虚拟机比较1.4、分析 Docker 容器架构1.4.1、Docker客户端和服务器1.4.2、Docker 镜像(Image)1.4.3、Docker 容器(Container)1.4.4、Docker 仓库(reposit…...

基于海鸥算法改进的DELM分类-附代码

海鸥算法改进的深度极限学习机DELM的分类 文章目录海鸥算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.海鸥算法4.海鸥算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考:https://blog.c…...

linux基本功系列之mount命令实战

文章目录前言一. mount命令的介绍二. 语法格式及常用选项三. 参考案例3.1 将iso镜像挂载到/mnt上3.2 把某个分区挂载到/sdb1上3.3 用只读的形式把/dev/sdb2挂载到/sdb2上3.4 设置自动挂载总结前言 大家好,又见面了,我是沐风晓月,本文是专栏【…...

力扣Top100题之两数相加(Java解法)

0 题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数…...

【测试】Python手机自动化测试库uiautomator2和weditor的详细使用

1.说明 我们之前在电脑操作手机进行自动化测试,基本上都是通过Appium的,这个工具确实强大,搭配谷歌官方的UiAutomator基本上可以完成各种测试,但缺点也很明显,配置环境太麻烦了,需要jdk、sdk等&#xff0c…...

《NFL橄榄球》:旧金山49人·橄榄1号位

旧金山四九人(San Francisco 49ers,又译旧金山淘金者) 是美国全国橄榄球联盟球队。成立于1946年,最初作为全美橄榄球联合会(AAFC)的一员参加比赛,后于1950年与克利夫兰布朗一同加入由美国橄榄球联合会合并而成的NFL。现任主教练为…...

spark为什么比hadoop快

网上一堆人根本对计算框架一知半解就出来糊弄人,常见解答有: spark是基于内存计算,所以快。这跟废话似的,mr计算的时候不也是基于内存? mr shuffle落盘。这也是胡扯, spark shuffle不落盘? 实际…...

跨境人都在用的指纹浏览器到底有什么魔力?三分钟带你了解透彻

什么是指纹浏览器?这是东哥近期收到最多的粉丝私信咨询,指纹两个字大家都很熟悉,指纹浏览器就变得陌生起来。之前东哥也跟大家分享过很多次指纹浏览器的用法,鉴于还是很多人不认识这个好用的工具,东哥今天就来详细给大…...

机器学习概述

机器学习是人工智能的核心研究领域之一,其研究动机是为了让计算机系统具有人的学习能力以便实现人工智能。目前被广泛采用的机器学习的定义是“利用经验来改善计算机系统自身的性能”。由于“经验在计算机系统中主要是以数据的形式存在的,因此机器学习需…...

企业网站自动生成系统的设计和实现

技术:Java、JSP等摘要:随着Internet技术的发展,人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势&…...

sikuli+eclipse对于安卓app自动化测试的应用

Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces (GUI) using images (screenshots). Sikuli includes Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an …...

react源码分析:babel如何解析jsx

同作为MVVM框架,React相比于Vue来讲,上手更需要JavaScript功底深厚一些,本系列将阅读React相关源码,从jsx -> VDom -> RDOM等一些列的过程,将会在本系列中一一讲解 工欲善其事,必先利其器 经过多年的…...

搜广推 WideDeep 与 DeepCrossNetwork (DCN) - 记忆+泛化共存

😄 这节来讲讲Wide&Deep与Deep&CrossNetwork (DCN)。从下图可看出WD非常重要,后面衍生出了一堆WD的变体。本节要讲的WD和DCN结构都非常简单,但其设计思想值得学习。 🚀 wide&deep:2016年,谷歌提出。 🚀 Deep&CrossNetwork (DCN):2017年,谷歌和斯坦…...

项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal

这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善的甘特图图表库 DhtmlxGantt正版试用下载(qun;765665…...

k-means聚类总结

1.概述 聚类算法又叫做‘无监督学习’,其目的是将数据划分成有意义或有用的组(或簇)。 2.KMeans 关键概念:簇与质心 KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的…...

char * 和const char *的区别

一、含义的不同 char* 表示一个指针变量,并且这个变量是可以被改变的。 const char*表示一个限定不会被改变的指针变量。 二、模式的不同 char*是常量指针,地址不可以改变,但是指针的值可变。 const char*是指向常量的常量指针&#xff…...

【剑指offer】JZ3 数组中重复的数字、 JZ4 二维数组中的查找

目录 JZ3 数组中重复的数字 思路: 解题步骤: JZ4 二维数组中的查找 思路 JZ3 数组中重复的数字 描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每…...

数据采集 - 笔记

1 redis GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps. Redis 通常被称为数…...

8年测开经验面试28K公司后,吐血整理出高频面试题和答案

#01、如何制定测试计划? ❶参考点 1.是否拥有测试计划的制定经验 2.是否具备合理安排测试的能力 3.是否具备文档输出的能力 ❷面试命中率 80% ❸参考答案 测试计划包括测试目标、测试范围、测试环境的说明、测试类型的说明(功能,安全&am…...

spring读取properties顺序,重复key问题

最近搞个开源工具,涉及到配置问题。 举例 有个应用A工具,打成jar给人用。应用B引用了A的jar A应用里resources/sys.properties文件里有个coreSize1 B引用了A,期望修改coreSize的值,改成2 开始天真以为,B应用里有同…...

什么是api接口?(基本介绍)

API:应用程序接口(API:Application Program Interface) 应用程序接口是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过调用 API 函数对应用程序进行开发,可以减轻编程任务。 …...

【2023全网最全教程】从0到1开发自动化测试框架(建议收藏)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大,容易遗漏;其次,代码模块常改动,回归测试很频繁,测试重复低效;最后&#x…...

3-5天炒股短线战法指标思想结合----超级短线源码无未来

超级短线以3-5个交易日获利3-5个点为目标,经过长期总结、实践、实盘操作编写的一个短线指标和思想! 如果你认为这一个指标像股市提款机一个,可以随意的赚钱,请你不要购买; 如果你你购买了指标又不想思考分析,想随意的赚…...

原始GAN-pytorch-生成MNIST数据集(代码)

文章目录原始GAN生成MNIST数据集1. Data loading and preparing2. Dataset and Model parameter3. Result save path4. Model define6. Training7. predict原始GAN生成MNIST数据集 原理很简单,可以参考原理部分原始GAN-pytorch-生成MNIST数据集(原理&am…...

注意,这些地区已发布2023年上半年软考报名时间

距离2023年上半年软考报名越来越近了,目前已有山西、四川、山东等地区发布报名简章,其中四川3月13日、山西3月14日、山东3月17日开始报名。 四川 报名时间:3月13日至4月3日。 2.报名入口:https://www.ruankao.org.cn/ 缴费时间…...

Html引入外部css <link>标签 @import

Html引入外部css 方法1: <link rel"stylesheet" href"x.css"> <link rel"stylesheet" href"x.css" /><link rel"stylesheet" href"x.css" type"text/css" /><link rel"sty…...

React源码分析8-状态更新的优先级机制

这是我的剖析 React 源码的第二篇文章&#xff0c;如果你没有阅读过之前的文章&#xff0c;请务必先阅读一下 第一篇文章 中提到的一些注意事项&#xff0c;能帮助你更好地阅读源码。 文章相关资料 React 16.8.6 源码中文注释&#xff0c;这个链接是文章的核心&#xff0c;文…...

如何在ChatGPT的API中支持多轮对话

一、问题 ChatGPT的API支持多轮对话。可以使用API将用户的输入发送到ChatGPT模型中&#xff0c;然后将模型生成的响应返回给用户&#xff0c;从而实现多轮对话。可以在每个轮次中保留用户之前的输入和模型生成的响应&#xff0c;以便将其传递给下一轮对话。这种方式可以实现更…...