【Python】3.3实现多线程

news2024/11/16 15:59:32

程序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 random


def 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 random


def 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 random


def 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. 多线程与资源


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

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

相关文章

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(10)

目录 竞赛内容 模块A 基础设施设置与安全加固 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一 登录安全加固(Windows, Linux) 1.密码策略(Windows, …

创作者基金亮点总结|2023 年 2 月

新的一月,新的创作者基金亮点!我们把 2 月份的精华作品都聚集在了一个地方:The Sandbox 市场平台! 24 项全新资产已经加入创作者基金的作品集啦! NFT 作品一览 一起来看看 2023 年 2 月份的作品集吧~ 独眼巨…

一个基于 LKM 的 Linux 内核级 rootkit 的实现

博客已迁移至:https://gls.show/ GitHub链接 演示Slides overview rootkit是一种恶意软件,攻击者可以在获得 root 或管理员权限后安装它,从而隐藏入侵并保持root权限访问。rootkit可以是用户级的,也可以是内核级的。关于rootk…

基于Docker部署Dubbo+Nacos服务

一、说明 本文介绍基于 Docker 部署一套 Dubbo Nacos 的微服务环境,并解决容器里的 IP 及端口的访问问题。 基于上文《基于jib-maven-plugin快速构建微服务docker镜像》 中在阿里云镜像仓库构建的镜像来进行部署。 二、部署 Nacos 注册中心 拉取 nacos 注册中心镜…

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

文章目录前言一. uniq的命令介绍二. 语法格式及常用选项三. 参考案例3.1 统计行数3.2 对文本进行去重3.3 显示不重复的行3.4 仅显示重复的行,且显示重复的行的所有行3.5 忽略字母大小写总结前言 大家好,又见面了,我是沐风晓月,本…

【vulhub漏洞复现】CVE-2016-3088 ActiveMQ任意文件写入漏洞

一、漏洞详情影响版本:Apache ActiveMQ 5.x~5.14.0漏洞原理:ActiveMQ中存储文件的fileserver接口支持写入文件,但是没有执行权限。可以通过MOVE文件至其他可执行目录下,从而实现文件写入并访问。ActiveMQ在5.12.x~5.13.x版本中&am…

PowerShell Install Rabbitmq

Rabbitmq 前言 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代…

设计模式-第4章(装饰模式)

装饰模式装饰模型装饰模式示例商场收银程序(简单工厂策略装饰模式实现)装饰模式总结装饰模型 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为…

【基础算法】双指针----字符串删减

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

Java查漏补缺(13)泛型概述、使用泛型举例、自定义泛型结构、泛型在继承上的体现、通配符的使用

Java查漏补缺(13)泛型概述、使用泛型举例、自定义泛型结构、泛型在继承上的体现、通配符的使用本章专题与脉络1. 泛型概述1.1 生活中的例子1.2 泛型的引入2. 使用泛型举例2.1 集合中使用泛型2.1.1 举例2.1.2 练习2.2 比较器中使用泛型2.2.1 举例2.2.2 练…

Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目

上篇请移步到Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 上一篇博文已经对Node.js的安装与配置进行了详细介绍。 另外:文中项目存放的路径及项目名称可根据自身实际情况进行更改。 目录 三、Vue安装配置 1、搭建Vue脚手架 2、通过NPM安装Vue …

二手商品交易网站

技术:Java、JSP等摘要:随着科学技术和信息通讯的飞速发展,Internet极大地丰富和改变着我们生活的各个行业。随着Internet的普及应用,人们可以跨越时间和空间的限制,足不出户便能通过网络完成信息交流,而完成…

Windows如何查看某个端口被占用的情况?

在工作中,有时会发现端口被占用的情况,导致软件报错或者服务无法启动等问题。在不知道具体哪个进程占用该端口号的情况下,我们可以用下面方法来查找。 举例:我现在发现8090端口被占用了,我现在需要找到并杀掉该进程。…

ICA简介:独立成分分析

1. 简介 您是否曾经遇到过这样一种情况:您试图分析一个复杂且高度相关的数据集,却对信息量感到不知所措?这就是独立成分分析 (ICA) 的用武之地。ICA 是数据分析领域的一项强大技术,可让您分离和识别多元数据集中的底层独立来源。 …

嵌入式 STM32 红外遥控

目录 红外遥控 NEC码的位定义 硬件设计 软件设计 源码程序 红外遥控 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,容易实现等显著的特点,被诸多电子设备特别…

二进制、十六进制和浮点数ASCII的转换机制--------IEEE754

我在使用GPS时,通过网口接收到了BESTPOS格式的输出结果,它以16进制表示。 当前常见的GPS都以ASCII表示,例如我们在串口助手中可以选择输出类型为ASCII或者是16进制,那么说明它们中见肯定存在某种转换机制,既可以表示出…

javaEE 初阶 — 网络层 IP 协议 的功能 — 路由选择与地址管理

文章目录IP 协议的功能1.IP 协议的路由选择2.IP 协议的地址管理2.1 网络号与主机号的分界2.2 特殊 IPIP 协议的功能 网络层主要做两件事: 地址管理 路由选择 网络层的代表就是 IP 协议 网络层主要是负责管理路由设备,要从两个结点之间找到一条具体的…

01 presto 概述: 特性 优缺点 场景 架构

文章目录1. Presto是什么2. Presto优缺点2.1. 优点2.2. 缺点3. Presto适用场景4. Presto数据模型5. Presto 架构5.1 执行流程关键词:MPP 多源 即席查询 统一SQL执行引擎 分布式SQL引擎 数据分析 1. Presto是什么 Presto是一款开源的分布式并行计算(MPP)引擎&#x…

Hive基础命令

一、Hive其他命令 1、在hive cli命令窗口中如何查看hdfs文件系统 dfs -ls /;2、在hive cli命令窗口中如何查看本地文件系统 !ls /opt;二、Hive数据类型 1、基本数据类型 红标为常用的数据类型; 对于Hive的String类型相当于数据库的varchar类型,该类型…

python之web自动化测试框架

梳理下搭建web自动化框架的流程: 创建目录: cases:存放测试用例,unittest框架要求用例名必须以test开头,所以命名test_case.py test_case.py代码如下:继承unittest.TestCase类下面的方法setupclass(),te…