【多线程】
文章目录
- 一、线程与进程的概念:
- 二、多线程实现
- 三、线程锁
- 四、线程数量的设置
一、线程与进程的概念:
简单理解
假设总共有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可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
