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

进程、线程、协程

在这里插入图片描述

文章目录

  • 前言
  • 一、易混概念
    • 1.1 同步vs异步
    • 1.2 并发vs并行
  • 二、进程(Process)
    • 2.1进程概念
    • 2.2 进程三个基本状态
    • 2.3多进程方式编程
  • 三、线程(Thread)
    • 3.1 线程的引入
    • 3.2 线程概念
    • 3.3 多线程编程
    • 3.4 GIL对多线程的影响
    • 3.5 GIL是否意味着线程安全
  • 四、协程(Coroutine)
    • 4.1 协程概念
  • 总结

前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

首先这三者是有明显的大小关系
进程 > 线程 > 协程
一个进程可以有多个线程,一个线程里面可以有多个协程


一、易混概念

1.1 同步vs异步

同步(sync):发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。 简
单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步( async):当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操
作。
在这里插入图片描述
同步和异步的区别:请求发出后,是否需要等待结果,才能继续执行其他操作。

1.2 并发vs并行

并发(Concurrency):指在行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
在这里插入图片描述

并行(Parallelism):有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
在这里插入图片描述

二、进程(Process)

2.1进程概念

一台计算机所能利用的资源总是有限的,比如 CPU 在 1 秒钟之内最多执行 1 亿条指令,计算机一共有6GB 的内存空间等等。因此,“如何提高计算机资源的利用率”是人们一直思考的问题,这个问题也一直带动着计算机硬件和软件的发展。

计算机发展早期,程序的控制历经:管理员>批处理>多任务操作系统

为了使多任务操作系统更高效地完成计算机资源的分配和回收,便于管理各个程序的执行过程,人们提出了“进程”的概念。

  • 进程是一个实体,结构包含程序、数据和进程控制块。
  • 每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
    • 文本区域存储处理器执行的代码;
    • 数据区域存储变量和进程执行期间使用的动态分配的内存;
    • 堆栈区域存储着活动过程调用的指令和本地变量
  • 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

2.2 进程三个基本状态

进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。

1)就绪状态(Ready):
    进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

2)运行状态(Running):执行状态
    进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

3)阻塞状态(Blocked):
    由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。
在这里插入图片描述
(1) 就绪→运行态
处于就绪状态的进程,当进程调度程序为之分配了CPU后,该进程便由就绪状态转变成执行状态。

(2) 运行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出CPU,于是进
程从执行状态转变成就绪状态。

(3) 运行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

2.3多进程方式编程

from multiprocessing import Process
import os
import time# 子进程要执行的代码
def task_process(delay):num = 0for i in range(delay*10000000):num+=iprint(f"进程pid为 {os.getpid()},执行完成")if __name__=='__main__':print( '父进程pid为 %s.' % os.getpid())t0 = time.time()task_process(3)task_process(3)t1 = time.time()print(f"顺序同步方式执行耗时 {t1-t0} ")p0 = Process(target=task_process, args=(3,))p1 = Process(target=task_process, args=(3,))t2 = time.time()p0.start();p1.start()p0.join();p1.join()t3 = time.time()print(f"多进程并发执行耗时 {t3-t2}")

在这里插入图片描述

三、线程(Thread)

3.1 线程的引入

    早期的多任务操作系统,以进程为单位管理各个程序的运行以及计算机资源的分配和回收,进一步提高了计算机资源的利用率。但随着计算机硬、软件的发展,人们发现还可以做进一步优化,例如:

  • 操作系统将 CPU 资源从一个进程分配给另一个进程时,开销较大;
  • 各个进程占用的内存空间是相互独立的,大大增加了进程间通信的实现难度;
  • 一个进程可能会执行多个任务,当某个任务因 I/O 操作暂停执行时,其他任务将无法执行。

在计算机软、硬件快速发展,人们计算机运行效率的要求越来越高的大背景下,“线程”应运而生。

3.2 线程概念

    线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,比如一段程序、一个函数等。

    线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。一个工厂可以容纳多个工人,工厂负责为所有工人提供必要的资源(电力、产品原料、食堂、厕所等),所有工人共享这些资源,每个工人负责完成一项具体的任务,他们相互配合,共同保证整个工厂的平稳运行。

每个进程执行前,操作系统都会为其分配所需的资源,包括要执行的程序代码、数据、内存空间、文件资源等。一个进程至少包含 1 个线程,可以包含多个线程,所有线程共享进程的资源,各个线程也可以拥有属于自己的私有资源。
在这里插入图片描述

3.3 多线程编程

多线程概念:

一个进程中拥有多(≥2)个线程,线程之间相互协作、共同执行一个应用程序。

通常将以“多线程”方式编写的程序称为“多线程程序”,将编写多线程程序的过程称为“多线程编程”,将拥有多个线程的进程称为“多线程进程”。

当进程中仅包含 1 个执行程序指令的线程时,该线程又称“主线程”,这样的进程称为“单线程进
程”。

很多应用程序(软件)都是多线程程序,例如 QQ 具备同时和多人聊天的能力、迅雷具备同时下载多个资源的能力、很多杀毒软件可以同时开启杀毒、清理垃圾、电脑加速等功能。

3.4 GIL对多线程的影响

import threading, timedef my_counter():total = 100_000_000i = 0for _ in range(total):i = i+1if i % (total/10) == 0:print(f"当前进度:{i/total:.2%} ")return Truedef main1():thread_ary = {}start = time.time()for tid in range(2):t = threading.Thread(target=my_counter)t.start()t.join()  # 第1次循环,join方法引起主线程阻塞,但第2个线程并没有启动,所以2个线程是顺序执行的end = time.time()print(f"单线程顺序执行方式:total_time: {end - start:.2f}")def main2():thread_ary = {}start = time.time()for tid in range(2):t = threading.Thread(target=my_counter)t.start()thread_ary[tid] = tfor i in range(2):thread_ary[i].join() # 两个线程均已启动,所以两个线程是并发的end = time.time()print(f"多线程并发执行方式:total_time: {end-start:.2f}")if __name__ == "__main__":main1()main2()
100_000_000
单线程顺序执行方式:total_time: 36.82
多线程并发执行方式:total_time: 36.97
1_000_000_000
单线程顺序执行方式:total_time: 368.88
多线程并发执行方式:total_time: 366.76

3.5 GIL是否意味着线程安全

并不是。GIL是用来保护Python解释器的线程安全,不是用来保护用户线程的线程安全,软件开发人员需要自己解决。

解释器本身有大量的变量,是需要进行保护的。假设没有GIL时,两个线程都需要抛出异常,那么异常应该如何存储和处理,改变解释器的状态,就成了问题。GIL在此环境里就限制了解释器本身只有一个线程处于运行中,任意Python解释器级别操作都是串行的,使得任一时间都只能有最多一个语句抛出异常。于是异常相关的共享变量就得到了保护。但对于Python程序里,用户创建的线程,就需要程序员自己利用threading里的设施来进行并发保护。因为一个Python语句,往往对应了底层的多个Python解释器操作,这些操作的执行顺序可能会被操作系统的抢占式多任务打乱的。所以不得不进行保护。

举个例子,打印语句:
print("hello world")
其底层就至少可以分为3个操作,现实中可能操作更多:
sys.sdout.write("hello world")
sys.stdout.write("\n")
sys.stdout.flush()

所以在多个线程一起执行 print(“hello world”) 时,屏幕上就可能看到同一行里多个hello world,这就是语句内部的操作被抢占式多任务打乱的结果。

四、协程(Coroutine)

4.1 协程概念

是一个更小的概念,它是位于线程内部,完全受程序所控制,开销小,协程,又称微线程,也称为用户级线程,在不开辟线程的基础上完成多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行,它的特点就是运行效率极高。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
在这里插入图片描述

相关文章:

进程、线程、协程

文章目录 前言一、易混概念1.1 同步vs异步1.2 并发vs并行 二、进程(Process)2.1进程概念2.2 进程三个基本状态2.3多进程方式编程 三、线程(Thread)3.1 线程的引入3.2 线程概念3.3 多线程编程3.4 GIL对多线程的影响3.5 GIL是否意味…...

嵌入式工程师成长之路(1)——元件基础(完整版)

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、认识元件①、认识元件②、认识封装二、电阻1.上拉电阻与下拉电阻①、定义②、应用③、阻值选择④、因上下拉电…...

在Ubuntu 20.04 上安装 CoppeliaSim

在 Ubuntu 20.04 上安装 CoppeliaSim Edu V4.6.0 rev18 的步骤如下: 1. 下载安装文件: 首先,确保您已经下载了 CoppeliaSim_Edu_V4_6_0_rev18_Ubuntu20_04.tar.xz 文件。您可以从 Coppelia Robotics 的官方网站下载。 2. 解压缩文件: 打开终端&#…...

pulseaudio的相关操作(二)

这篇文章主要介绍pulseaudio playback的相关API,pulseaudio playback的具体实例可以参考[2]。如果用pulseaudio实现playback,简单地说就是创建一个playback stream,然后指定这个stream的sink,再定期的向这个stream中写数据。 mai…...

Selenium自动化测试工具

一 .Selenium简介 是一个用于Web应用程序测试的工具 Selenium的核心功能之一是测试软件在不同浏览器和操作系统上的兼容性,确保软件功能与用户需求的一致性,提升用户体验。 自动化脚本生成与执行 Selenium支持自动录制用户操作并生成多种编程语言的测…...

优化UVM环境(九)-将interface文件放在env pkg外面

书接上回: 优化UVM环境(八)-整理project_common_pkg文件 My_env_pkg.sv里不能包含interface,需要将my_intf.sv文件放在pkg之外...

mysql 主从安装

登录看第二篇 WINDOWS系统搭建MYSQL 8.0主从模式_windows mysql8.0.34主从配置-CSDN博客 Windows下MySQL8.0最新版本超详细安装教程_windowsserver安装mysql8.0-CSDN博客 启动两个服务 可执行文件路径一致问题解决: windows,同一台机器安装两个mysq…...

【C++刷题】力扣-#121-买卖股票的最佳时机

题目描述 给定一个数组 prices,其中 prices[i] 表示第 i 天的股票价格。假设你可以在第 i 天买入并在第 j 天卖出股票(i ≤ j),设计一个算法来计算你所能获取的最大利润。注意你只能持有一股股票,并且你不能同时参与多…...

Python量化交易(二):金融市场的基础概念

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档;在现代社会中,投资已成为个人、机构和政府追求财富增长和资源配置的重要方式。…...

Java方法的递归调用

Java中的方法可以通过调用自身来实现递归调用。 递归调用在解决一些问题时非常有用,特别是那些可以分解为相同结构的子问题的情况。递归调用可以让问题的解决过程更加简洁和优雅。 下面是一个简单的示例,展示了如何使用递归调用来计算一个数字的阶乘&a…...

JavaScript 第30章:综合项目

看起来您想要了解如何在一个JavaScript为主的项目中进行项目规划、技术选型、开发流程以及维护等方面的内容,并且希望结合Java的源代码来进行详细的讲解。不过,JavaScript和Java是两种不同的编程语言,通常它们的应用场景也不同。JavaScript 主…...

GB/T28181-2022规范解读、应用场景和技术实现探究

GB/T28181-2022和GB/T28181-2016区别 GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》与 GB/T28181-2016 相比,主要有以下区别: 术语和定义方面: 术语删减:GB/T28181-2022 删除了 “联网系统信息”“数…...

Docker容器间链路管理

Docker容器是一个轻量级的、可移植的软件打包技术,它允许开发者将应用程序及其依赖项打包到一个独立的容器中,然后发布到任何支持Docker的环境中运行。容器是完全使用沙箱机制,相互之间不会有任何接口,容器性能开销极低。 可以将…...

python画图|在三维空间的不同平面上分别绘制不同类型二维图

【1】引言 前序已经完成了基础的二维图和三维图绘制教程探索,可直达的链接包括但不限于: python画图|3D参数化图形输出-CSDN博客 python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客 在学习过程中,发现一个案例&#xff1…...

与ai一起作诗(《校园清廉韵》)

与ai对话犹如拷问自己的灵魂,与其说ai助力还不如说在和自己对话。 (笔记模板由python脚本于2024年10月19日 19:18:33创建,本篇笔记适合喜欢python和诗歌的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…...

python matplotlib

一、图形函数 函数名称描述Bar绘制条形图Barh绘制水平条形图Boxplot绘制箱型图Hist绘制直方图his2d绘制2D直方图Pie绘制饼状图Plot在坐标轴上画线或者标记Polar绘制极坐标图Scatter绘制x与y的散点图Stackplot绘制堆叠图Stem用来绘制二维离散数据绘制(又称为火柴图&…...

秋招面试题记录_半结构化面试

c八股(可能问的多一点) 1.简单说说C11语法特性 答: 1.auto以及decltype自动类型推导,避免手动声明复杂类型,减少冗长代码提升了可读性和安全性。 2.智能指针 自动释放内存 (具体说说) 有shared和unique 差异主要体现在所有权、内存开销、…...

Java项目-基于springboot框架的疫苗接种管理系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

Android 12.0进程保活白名单功能实现

在Android 12.0系统中,实现进程保活白名单功能是为了确保某些重要的应用程序即使进入后台也能长时间保持运行状态,不被系统自动杀死。这一功能的实现涉及多个核心类和文件,以下是具体的实现步骤和核心功能分析: 一、实现步骤 …...

vscode 功能、设置备忘

2024年10月18日 crtl p 按文件名搜索,输入> 开始搜索命令 设置文件显示过滤和搜索过滤: ctrlp 输入 >settings 选择Preferences:Open Settings(UI),搜索exclude 配置 Files Exclude 修改显示过滤 配置 Search Exclude 修…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...