并发编程基础概念

相关概念

并行

并行是指同一个时刻,多个任务同时进行。只有在多核CPU下才会发生。

并发

并发是指单个CPU在不同任务之间来换切换工作,但是同一时刻只有一个任务在工作。由于CPU的切换速度很快,给人的感受是多个任务在一起运行。

串行

串行是指单个CPU根据任务队列顺序执行任务,只有前面的任务完成后才会执行后面的任务。

进程

进程是程序在计算机中运行的具体实现。进程一般由程序段数据集控制块组成。

  • 程序段是指任务的指令集
  • 数据集是指任务执行过程中需要的变量,函数,类等数据
  • 控制块是记录CPU处理任务时用到的控制模块

在操作系统中进程使用pid(process identification)表示。pid由进程创建时,操作系统分配得到。并且在进程运行过程中pid不会发生改变。

复制代码
 import os
 ​
 # 获取当前进程的pid
 print(os.getpid())
 # 获取当前进程的父进程pid
 print(os.getppid())

线程

进程内的一个任务执行的独立单元,是任务调度和系统执行的最小单位。

协程

用户态的轻量级线程,协程的调度完全由用户控制,主要为单线程下模拟多线程。

一个程序可以由一到多个进程,一个进程可以有一到多个线程,一个线程下可以有一到多个协程。

进程状态

在操作系统创建进程,到销毁进程的过程中,进程一般存在三个状态就绪运行阻塞

  • 就绪:进程获取了除CPU外的及其资源,一旦获取CPU资源就可以工作的状态
  • 运行:CPU在工作,且进程工作的状态
  • 阻塞:CPU没有工作,且进程工作的状态,往往是在执行IO操作

同步/异步

同步和异步是多任务处理过程中的不同方式或手段。

同步

同步就是多任务发生时,系统按照任务顺序依次执行,只有前面的任务结束后,才会执行后面的任务。

异步

异步就是多任务发生时,系统会以并行或并发的方式处理多任务,让多任务之间不必相关等待。

案例说明

同步:某人去商场购买洗衣机然后回家做饭。她必须要等商场配好洗衣机后,然后带着洗衣机,回家做饭。

异步:某人去商场相中洗衣机后,网上下单,然后回家做饭。此时她不需要等待商场配好洗衣机后才回家,网上下单后就可以直接回家了。

阻塞/非阻塞

阻塞和非阻塞是进程处于阻塞状态时,CPU的工作方式。

阻塞

当任务处于阻塞时,CPU处于等待状态,不能处理其他任务。

非阻塞

当任务处于阻塞时,CPU不必等待,能够处理其他任务。

同步阻塞

当系统以同步方式处理多任务时,如果任务A发生了阻塞状态,则任务A后面的所有任务都必须要等待任务A结束阻塞状态,且完成后才能执行。

复制代码
 import time
 ​
 ​
 def taska():
     print("task a started")
     time.sleep(5)
     print("task a ended")
 ​
 ​
 def taskb():
     print("task b started")
     time.sleep(5)
     print("task b ended")
 ​
 ​
 if __name__ == "__main__":
     queue = [taska, taskb]
     for task in queue:
         task()

异步阻塞

当系统以异步方式处理多任务时,如果任务A发生阻塞状态,系统需要等待,而不会切换至其他任务进行处理。

复制代码
 """
 @Time: 2024/6/28 20:18
 @Author: 'Ethan'
 @Email: [email protected]
 @File: 1. 同步阻塞.py
 @Project: python
 @Feature:
 """
 import time
 import multiprocessing
 ​
 ​
 def taska():
     print("task a started")
     time.sleep(5)
     print("task a ended")
 ​
 ​
 def taskb():
     print("task b started")
     time.sleep(5)
     print("task b ended")
 ​
 def taskc():
     print("task c started")
     time.sleep(5)
     print("task c ended")
 ​
 if __name__ == "__main__":
     processa = multiprocessing.Process(target=taska)
     processb = multiprocessing.Process(target=taskb)
     processc = multiprocessing.Process(target=taskc)
     queue = [processa, processb, processc]
     for process in queue:
         process.start()
         process.join() # 阻塞
 ​

同步非阻塞

当系统以同步方式处理多任务时,如果前面的任务A出现阻塞状态,则后面的任务B不必等待,直接运行。

异步非阻塞

当系统以异步方式处理多任务时,如果前面的任务A出现阻塞状态,则不需等待切换至任务B运行。

复制代码
 """
 @Time: 2024/6/28 20:18
 @Author: 'Ethan'
 @Email: [email protected]
 @File: 1. 同步阻塞.py
 @Project: python
 @Feature:
 """
 import time
 import multiprocessing
 ​
 ​
 def taska():
     print("task a started")
     time.sleep(5)
     print("task a ended")
 ​
 ​
 def taskb():
     print("task b started")
     time.sleep(5)
     print("task b ended")
 ​
 def taskc():
     print("task c started")
     time.sleep(5)
     print("task c ended")
 ​
 if __name__ == "__main__":
     processa = multiprocessing.Process(target=taska)
     processb = multiprocessing.Process(target=taskb)
     processc = multiprocessing.Process(target=taskc)
     queue = [processa, processb, processc]
     for process in queue:
         process.start()

发布于 2024-06-28 21:30・IP 属地江苏

相关推荐
NEET_LH几秒前
金融数据分析(Python)个人学习笔记(6):安装相关软件
python·金融·数据分析
哈哈哈哈哈哈哈哈哈...........42 分钟前
【java】在 Java 中,获取一个类的`Class`对象有多种方式
java·开发语言·python
@小白向前冲1 小时前
python 重要易忘 语言基础
开发语言·python
蹦蹦跳跳真可爱5891 小时前
Python----计算机视觉处理(Opencv:道路检测之车道线拟合)
开发语言·人工智能·python·opencv·计算机视觉
bookish_2010_prj1 小时前
Jupyter notebook定制字体
linux·python·jupyter
查理零世1 小时前
【蓝桥杯速成】日期问题(填空题) + 真题讲解 python
python·算法·蓝桥杯
意.远1 小时前
PyTorch参数管理详解:从访问到初始化与共享
人工智能·pytorch·python·深度学习
小小鸭程序员2 小时前
Spring Boot项目连接MySQL数据库及CRUD操作示例
java·spring boot·python·mysql·spring
唐叔在学习2 小时前
【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
python·beautifulsoup·html解析·爬虫进阶·反爬策略
love530love2 小时前
怎么使用嵌套虚拟环境实现项目部署之virtualenv嵌套conda绕开安装环境检测实现.venv部署facefusion
python·conda·virtualenv