【多线程】
文章目录
- 一、线程与进程的概念:
- 二、多线程实现
- 三、线程锁
- 四、线程数量的设置
一、线程与进程的概念:
简单理解
假设总共有3个孩子需要喂饭,孩子每吃一口饭需要咀嚼消化一下。
多线程方案: 雇佣1个保姆,在喂A孩子吃饭,等到他开始咀嚼的时候,开始喂第二个孩子,等到第二个孩子开始咀嚼的时候,开始喂第三个孩子。
多进程方案: 雇佣3个保姆,3个保姆分别喂3个孩子。
线程与进程的概念
- 进程是资源的分配和调度的独立单元。进程拥有完整的虚拟地址空间,当发生进程切换时,不同的进程拥有不同的虚拟地址空间。而同一进程的多个线程共享同一地址空间(不同进程之间的线程无法共享)
- 线程是CPU调度的基本单元,一个进程包含若干线程(至少一个线程)。
- 线程比进程小,基本上不拥有系统资源。线程的创建和销毁所需要的时间比进程小很多
- 由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作
- 一个线程的意外终止会影响整个进程的正常运行,但是一个进程的意外终止不会影响其他的进程的运行。因此,多进程程序安全性更高。
总之,多进程程序安全性高,进程切换开销大,效率低;多线程程序维护成本高,线程切换开销小,效率高。
并发
指在同一时间段内,有多个任务在交替执行。在多任务操作系统中,多个任务可以在同一时间共享CPU,因此表现出来的是并发执行的状态。这种情况下,多个任务的执行是交替进行的,每个任务都会分配到一定的时间片来执行,直到任务完成或者时间片用完。
并发可以提高系统的吞吐量和资源利用率,因为在同一时间段内,多个任务可以同时执行,从而提高CPU的利用率和系统的响应速度。但是,在并发执行中,由于CPU时间片的切换和任务间的上下文切换等开销,会降低系统的效率,增加系统的负担。此外,如果多个任务之间存在资源争用的情况,还需要采用同步机制来保证资源的正确性。
并行
是指在同一时间段内,有多个任务同时执行。在多处理器系统中,不同的处理器可以同时执行不同的任务,因此表现出来的是并行执行的状态。这种情况下,不同的处理器可以同时执行不同的任务,从而提高系统的性能和效率。
并行可以进一步提高系统的性能和吞吐量,因为不同的任务可以同时执行,而不需要等待其他任务的完成。这可以使得系统的处理能力得到充分的发挥,从而提高系统的响应速度和吞吐量。但是,在并行执行中,如果任务之间存在资源争用的情况,需要采用同步机制来保证资源的正确性和一致性。
并发与并行的区别
多线程在单核CPU上表现为并发,因为虽然多个线程同时执行,但在微观层面上仍然是交替执行的。然而,在多核CPU上,多线程可以并行执行,因为它们可以在不同的核心上同时执行。
多进程则不同,它们通常在多核或多CPU的计算机上并行执行。多进程是实现并行处理的有效方式,因为它们可以将任务分配到不同的CPU核心上,从而实现真正的并行处理。
二、多线程实现
线程的执行,是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程,我们看上去的线程A 和 线程B并发执行。
为了让用户感觉这些任务正在同时进行,操作系统利用了时间片轮转的方式,CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务。任务的状态保存及再加载,这段过程就叫做上下文切换。
Python
中通过threading
模块就可以很好地实现多线程,下面是一个简单的例子
import threading
import time# 在这里是每一个线程函数
def loop_func(i, sec):print("This is {} loop.".format(i))logging.warning(f'{i},{sec}')logging.info(f'{i},{sec}')time.sleep(sec)print("The {} loop finished.".format(i))def main():l = [10, 20, 15] # 每个函数的循环时间,这里可以调整为不同线程的参数池ts = []for i in range(len(l)):# 实例化3个Thread对象,target指定调用的函数,args指定传给loop_func的参数thread = threading.Thread(target=loop_func, args=(i, l[i]))ts.append(thread)for i in range(len(l)):ts[i].start() # 启动线程for i in range(len(l)):ts[i].join() # 阻塞线程,使得主线程等到所有的子线程完成后再退出结束print("Main Thread Finished")if __name__ == "__main__":start_time = time.time()main()end_time = time.time()print("耗时:{:.2f}秒".format(end_time - start_time))
这里有4个重要的地方:
- 线程函数的编写,此处为
loop_func
- 通过
threading.Thread()
方法,实例化线程 - 通过
start()
方法,启动线程 - 通过
.join()
方法,阻塞线程,使得主线程等到所有的子线程完成后再退出结束
需要注意的是,多线程的执行顺序是不确定的,线程的启动顺序不一定等于线程的执行顺序。
三、线程锁
线程锁(Tread Lock) 是一种同步机制,用于解决多线程访问共享资源可能出现的并发问题。在多线程环境下,多个线程对共享资源的访问可能导致数据不一致或其他不可预测的结果。线程锁通过对共享资源的访问进行控制,确保每一时刻只有一个线程能够访问共享资源,从而避免并发问题的产生。
线程锁的主要作用是保护共享资源,确保多个线程能够安全地访问共享资源。在多线程环境下,如果没有使用线程锁,可能会出现以下几种并发问题。
- 数据竞争(Data Race):多个线程同时读写共享资源,导致共享资源的值不确定或无法预测的结果。数据竞争是一种常见的线程安全问题,使用线程锁可以避免数据竞争的发生。在计算机操作系统中,所谓的I/O就是 输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘IO模型和网络IO模型。通常磁盘IO是容易出现数据竞争的请求。同时在写入磁盘的
- 死锁(DeadLock)、
- 饿死(Starvation)等并发问题。
import threading# 共享资源
count = 0# 创建互斥锁
lock = threading.Lock()def increment():global count# 获取锁lock.acquire()try:# 修改共享资源count += 1finally:# 释放锁lock.release()# 创建多个线程并启动
threads = []
for _ in range(10):thread = threading.Thread(target=increment)threads.append(thread)thread.start()# 等待所有线程结束
for thread in threads:thread.join()# 打印结果
print("Count:", count)
四、线程数量的设置
业务中,存在大量的网络IO与磁盘IO,这些流程是十分耗时的。线程在IO处理的时候,CPU就空闲出来,利用率不高,但并不是线程设置越多越好
关于线程数量的设定,该博客讲解地很清晰。
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
举例:服务器CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。
- CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 CPU核数*2。核数为4的话,一般设置 5 或 8
- IO密集型:文件操作,网络操作,数据库操作,一般线程设置为:cpu核数 / (1-0.9),核数为4的话,一般设置 40
https://blog.csdn.net/Rocky006/article/details/131655179
https://wenku.baidu.com/view/ab6ac3a2ac45b307e87101f69e3143323968f5d7.html
https://zhuanlan.zhihu.com/p/296796074
相关文章:
【多线程】
文章目录 一、线程与进程的概念:二、多线程实现三、线程锁四、线程数量的设置 一、线程与进程的概念: 简单理解 假设总共有3个孩子需要喂饭,孩子每吃一口饭需要咀嚼消化一下。 多线程方案: 雇佣1个保姆,在喂A孩子吃饭…...

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)
电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来,会有各…...

Nginx多ip部署多站点
目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置,使用 d…...

Unity SVN更新提交小工具
Unity SVN更新提交小工具 前言使用说明必要前提源码参数说明 感谢 前言 Unity开发时每次都要到文件夹中操作SVN,做了一个小工具能够在Editor中直接操作。 使用说明 必要前提 前提是要安装好SVN,在文件夹右键能够看到安装的SVN 源码 using System…...

听GPT 讲Rust源代码--compiler(19)
File: rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs 该文件(rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs)是Rust编译器针对MIPS架构上的Linux系统的目标描述文件。它的作用是定义了在这个目标上编译时的一些配置…...
redis单机部署
一、下载redis压缩包tar.gz 官网下载,现在一般用6.x以上版本 二、上传指定目录,解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录,进行编译 cd redis-6.2.14 make &&a…...

el-upload上传文件
需求:选中或拖拽文件后,使用http-request属性实现自动上传,并根据后端传回来的结果显示错误和控制fileList的显示,如果后端返回成功,则文件显示在文件列表处,如果后端返回失败,则文件列表不显示…...
算法导论复习——CHP16 贪心算法
定义 每一步都做出当前看来最优的操作。 问题引入——活动选择问题 问题描述 活动选择问题就是对给定的包含n个活动的集合S,在已知每个活动开始时间和结束时间的条件下,从中选出最多可兼容活动的子集合,称为最大兼容活动集合。 不失一般性&a…...

【霹雳吧啦】手把手带你入门语义分割の番外12:U2-Net 源码讲解(PyTorch)—— 网络的搭建
目录 前言 Preparation 一、U2-Net 网络结构图 二、U2-Net 网络源代码 1、model.py (1)ConvBNReLU 类 (2)DownConvBNReLU 类 (3)UpConvBNReLU 类 (4)RSU 类 & RSU4F 类…...

phpstudy面板Table ‘mysql.proc‘ doesn‘t exist解决办法
原因分析:误删了mysql数据库 解决办法如下: 1、停止服务 2、先把mysql文件夹下的data文件夹备份,因为data文件里存有数据库文件。然后再删除data文件。 3、cmd管理员命令进入到mysql中的bin目录下 ,执行mysqld --initialize-…...

网安入门09-Sql注入(绕过方法梳理)
ByPass SQL注入ByPass是指攻击者通过各种手段绕过应用程序中已经实施的SQL注入防御措施,例如输入恶意数据、修改请求头等方式,绕过过滤、转义、限制等操作,从而成功地执行恶意SQL语句。攻击者使用SQL注入ByPass技术可以让应用程序的防御措施…...

本地计算机 上的 My5OL808 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
客户反馈说mysql启动不了,报错信息: 本地计算机 上的 My5OL808 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。 查了不少资料,最后分析问题是这样的,手动或者重复安装mysql时,创建了多个…...

2023机器人行业总结,2024机器人崛起元年(具身智能)
2023总结: 1.Chatgpt引爆了通用人工智能,最大的受益者或是机器人,2023年最热门的创业赛道便是人形机器人,优必选更是成为人形机器人上市第一股, 可以说2023年是机器人开启智能化的元年,而2024则将成为机器…...
go 语言中的类型判断
_. ok : interface{}(a).(B)此语句用于判断对象a是否是B类型 也可以判断对象a是否实现了B接口 package mainimport "fmt"type Pet interface {SetName(name string)Name() stringCategory() string } type Dog struct {name string }func (dog *Dog) SetName(name …...

java基于ssm的房源管理系统+vue论文
目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…...

RH850P1X芯片学习笔记-A/D Converter (ADCF)
文章目录 Features of RH850/P1x-C ADCFNumber of UnitsRegister Base AddressClock SupplyInterrupts and DMAHardware ResetExternal Input/Output SignalsVirtual Channel OverviewFunctional OverviewBlock DiagramPhysical Channels, Virtual Channels and Scan Groups Re…...
38 调优kafka
操作系统调优 1.禁止atime更新,减少文件系统的写操作。 mount -o noatime 2.选择高性能的文件系统,如ext4或者XFS 3.swap空间设置,将swappniness设置成很小的一个值比如1~10,防止linux OOM Killer 开启随意杀掉进程。…...

java推荐系统:好友推荐思路
1.表的设计 表里面就两个字段,一个字段是用户id,另外一个字段是好友id,假如A跟B互为好友,那在数据库里面就会有两条数据 2.推荐好友思路 上面的图的意思是:h跟a的互为好友,a跟b,c&am…...

java: 写入数据到HBase
一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…...

机器学习-基于Word2vec搜狐新闻文本分类实验
机器学习-基于Word2vec搜狐新闻文本分类实验 实验介绍 Word2vec是一群用来产生词向量的相关模型,由Google公司在2013年开放。Word2vec可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...