32. 线程、进程与协程

一、什么是多任务

  如果一个操作系统上同时运行了多个程序,那么称这个操作系统就是 多任务的操作系统,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一个程序,它可以同时执行多个事情,那么就称为 多任务的程序

  一个 CPU 默认可以执行一个程序,如果想要多个程序一起执行,理论上就需要多个 CPU 来执行。

  如果一个 CPU 是一个核心,理论上只能同时运行一个任务,但是事实上却可以运行很多个任务。这是因为操作系统控制着 CPU,让 CPU 做了一个特殊的事情,一会运行一个任务,然后快速的运行另一个任务,依次类推,实现了多个任务,看上去 “同时” 运行多个任务。

并发:是一个对假的多任务的描述;

并行:是真的多任务的描述;

二、进程与线程

  计算机程序只是存储在磁盘上的可执行二进制(或其它类型)文件。只有把它们加载到内存中从被操作系统调用,才拥有其生命期。

  进程(process)则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行,并为这些进程合理分配时间。进程也可以通过派生新的进程来执行其它任务,不过因为每个新进程也都拥有自己的内存和数据栈等,所以只能采用进程间通信的方式共享数据;

  线程(thread)与进程类似,不过它们是同一个进程下执行的,并共享相同的下上文。线程包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下文。当其它线程运行时,它可以被抢占(中断)和临时挂起(也称为睡眠)—— 这种做法叫做让步(yielding)。

  一个进程中的各个线程与主线程共享同一片数据空间。线程一般是以并发方式执行的。在单核 CPU 系统中,因为真正的并发是不可能的,所以线程的执行实际上是这样规划的:每个线程运行一小会,然后让步给其它线程(再次排队等待更多的 CPU 时间)。在整个进程的执行过程中,每个线程执行它自己特定的任务,在必要时和其它线程进行结果通信。

  但是这种共享数据也是存在风险的。如果两个或多个线程访问同一片数据,由于数据访问顺序不同,可能导致结果不一致。这种情况通常称为 “竞态条件”(race condition)。另一个需要注意的问题时,线程无法给予公平的执行时间。这是因为一些函数会在完成前保持阻塞状态,如果没有专门为多线程情况进行修改,会导致 CPU 的时间分配向这些贪婪的函数倾斜。

  在实现多任务时,线程切换从系统层面远不止保存和恢复 CPU 上下文这么简单。操作系统为了程序运行的高效性,每个线程都有自己缓存 Cache 等数据。操作系统还会帮你做这些数据的恢复操作。所以线程的切换比较耗性能。但是协程的切换只是单纯的操作 CPU 的上下文。

线程是计算机中可以被 CPU 调度的最小单元,进程是计算机资源分配的最小单元;进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域;

一个程序,至少有一个进程,一个进程中至少有一个线程,最终是线程在工作;

一个进程内可以开设多个线程,在用一个进程内开设多个线程无需再次申请空间及拷贝代码的操作,开设线程的开销远远的要小于进程的开销;

单核 CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。但是因为 CPU 时间单元特别短,因此感觉不出来;

三、多进程的使用场景

  多进程 适合 计算密集型 的场景。

【1】、多进程的使用

import os, timefrom multiprocessing import Processdef task():val = 1for i in range(1, 100000):val *= iif __name__ == "__main__":l = []count = int(os.cpu_count())print(f"当前计算机CPU核心个数:{count}")start_time = time.time()for i in range(count):p = Process(target=task)p.start()l.append(p)for p in l:p.join()print(f"运行时间:{time.time() - start_time}")

【2】、多线程的使用

import os, timefrom threading import Threaddef task():val = 1for i in range(1, 100000):val *= iif __name__ == "__main__":l = []count = int(os.cpu_count())print(f"当前计算机CPU核心个数:{count}")start_time = time.time()for i in range(count):t = Thread(target=task)t.start()l.append(t)for t in l:t.join()print(f"运行时间:{time.time() - start_time}")

四、多线程的使用场景

  多线程 适合 IO 密集型 场景

【1】、多进程的使用

import timefrom multiprocessing import Processdef task():time.sleep(3)if __name__ == "__main__":l = []start_time = time.time()for i in range(1000):p = Process(target=task)p.start()l.append(p)for p in l:p.join()print(f"运行时间:{time.time() - start_time}")

【2】、多线程的使用

import timefrom threading import Threaddef task():time.sleep(3)if __name__ == "__main__":l = []start_time = time.time()for i in range(1000):t = Thread(target=task)t.start()l.append(t)for t in l:t.join()print(f"运行时间:{time.time() - start_time}")

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

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

相关文章

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 习题 推导 全概率公式与贝叶斯公式 伯努利概型求概率 一维随机变量及其分布

VLAN数据格式

概念:VLAN叫做虚拟局域网,指在物理网络中根据用于、工作组、应用等进行逻辑划分的局域网,是一个广播域,与用户的物理位置没有关系。 作用:VLAN可以灵活的进行分段和组织,能够实现更好的安全性,…

css 裁剪 clip-path

clip-path 是一个强大的 CSS 属性,用于裁剪元素的可视区域,支持多种形状裁剪。它可以用来创建复杂的裁剪效果,如圆形、多边形、路径等。 clip-path: none | shape | url(#clipPathId);none:不裁剪,显示完整内容。shap…

*【每日一题 基础题】 [蓝桥杯 2023 省 B] 飞机降落

题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti Di 时刻开始降落。降落过程需要 Li个单位时间…

计算机vcruntime140_1.dll丢失是什么原因?vcruntime140_1.dll丢失的解决办法如下:

计算机中vcruntime140_1.dll文件丢失的原因可能有多种,以下是一些常见的原因: 安装不完整或损坏:某些应用程序在安装过程中可能因为意外中断、安装程序损坏或其他原因导致vcruntime140_1.dll未能正确安装或复制到系统目录。软件卸载或更新不…

Redis学习(三)缓存

Redis学习(三)缓存 一、什么是缓存?如何使用缓存 二、添加商户缓存1、缓存模型和思路2、缓存更新策略1、数据库缓存不一致解决方案:2、数据库和缓存不一致采用什么方案 3、实现商铺和缓存与数据库双写一致 三、缓存穿透问题的解决思路1、编码…

软件设计与体系结构

1.简要说明什么是软件体系结构,软件体系结构模型,为什么要建立软件体系结构模型? 答:软件体系结构指一个软件系统在高层次上的结构化组织方式,包括系统的组成部分和各个部分之间的关系,以及它们与环境之间的…

Essential Use Cases和Real Use Cases

在软件开发领域,用例(Use Cases)是一种非常重要的工具,它能够帮助开发团队、产品经理以及用户之间对系统的功能需求达成一致。用例描述了在特定条件下,系统对用户请求所做出的响应,从而清晰地表达了系统的行…

P102如何降频降压

要对NVIDIA P102显卡进行降频降压操作,可以按照以下步骤进行: • 使用MSI Afterburner软件: • 打开MSI Afterburner,使用曲线编辑器调整频率和电压。竖轴为核心频率,横轴为电压。通过整体下移靠后的频率和电压区域&a…

概率论得学习和整理32: 用EXCEL描述正态分布,用δ求累计概率,以及已知概率求X的区间

目录 1 正态分布相关 2 正态分布的函数和曲线 2.1 正态分布的函数值,用norm.dist() 函数求 2.2 正态分布的pdf 和 cdf 2.3 正态分布的图形随着u 和 δ^2的变化 3 正态分布最重要的3δ原则 3.0 注意,这里说的概率一定是累计概率CDF,而…

HTML5文档元数据详解

HTML5文档元数据详解 在HTML5中&#xff0c;元数据&#xff08;Meta Data&#xff09;是文档头部的重要组成部分&#xff0c;提供了关于网页本身的信息。以下是一些常见的元数据标签及其详细说明。 1. <meta> 标签 <meta>标签用于定义文档的元数据&#xff0c;通…

使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 今天给大家介绍一款免费开源的在线聊天工具——Fiora。它不仅是一款功能强大的即时通讯软件&#xff0c;更是开发者们展现创造…

pm面试题

你平时都用哪些产品&#xff0c;这些产品好在哪里&#xff0c;不好在哪里&#xff0c;为什么&#xff1f;&#xff08;问到概率50%&#xff09; 把市面上的常见产品进行一个调研来设计一个跨境电商产品&#xff0c;请说明你需要多少费用和什么样的团队&#xff0c;将在一年内将…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot&#xff1a;算是“老牌”编程助手了&#xff0c;虽然Copilot在别的编辑器上也有扩展&#xff0c;不过体验最好的还是VS Code&#xff0c;毕竟都是微软家的所以功能集成更好一些&#xff1b;主要提供的是Complete和Chat能力&#xff0c;也就是代码补全…

Java Spring Boot 项目中嵌入前端静态资源:完整教程与实战案例

言简意赅的讲解Java Spring Boot 中嵌入前端项目的静态资源解决的痛点 之前给大家讲解了如何部署一个前端项目&#xff0c;但大家还是好奇如何部署一个前后端一体项目。将前端构建后的静态资源嵌入 Java Spring Boot 后端项目&#xff0c;是现代全栈开发中一种流行的实践方式。…

R200推理

一、环境搭建 1.下载镜像 wget https://bj.bcebos.com/klx- public/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz wget https://bj.bcebos.com/klxpublic/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz tar -zxvf a…

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…

可编辑99PPT | 智能工厂整体规划方案及实施细部方案

荐言分享&#xff1a;智能工厂是利用物联网、大数据、人工智能等先进技术&#xff0c;实现生产过程自动化、智能化和柔性化的现代工厂。本整体规划方案旨在通过整合信息技术、自动化技术、人工智能技术和物联网技术&#xff0c;构建一个高效、灵活、绿色、可持续的生产环境&…

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…

YOLOv8改进,YOLOv8引入Hyper-YOLO的MANet混合聚合网络+HyperC2Net网络

摘要 理论介绍 MANet 的目标是通过多种卷积操作的协同作用,提高特征提取能力,并加强梯度流动,从而提升模型在不同层次的特征表示和语义深度。MANet 结合了三种卷积变体,通过混合使用它们来提高视觉特征的多样性和信息流动性。 HyperC2Net 的主要目标是通过超图结构对多层次…