• 并发编程基础概念


    相关概念

    并行

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

    并发

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

    串行

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

    进程

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

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

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

    1. import os
    2. # 获取当前进程的pid
    3. print(os.getpid())
    4. # 获取当前进程的父进程pid
    5. print(os.getppid())

    线程

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

    协程

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

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

    进程状态

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

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

    同步/异步

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

    同步

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

    异步

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

    案例说明

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

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

    阻塞/非阻塞

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

    阻塞

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

    非阻塞

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

    同步阻塞

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

    1. import time
    2. def taska():
    3. print("task a started")
    4. time.sleep(5)
    5. print("task a ended")
    6. def taskb():
    7. print("task b started")
    8. time.sleep(5)
    9. print("task b ended")
    10. if __name__ == "__main__":
    11. queue = [taska, taskb]
    12. for task in queue:
    13. task()

    异步阻塞

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

    1. """
    2. @Time: 2024/6/28 20:18
    3. @Author: 'Ethan'
    4. @Email: ethanzhou4406@outlook.com
    5. @File: 1. 同步阻塞.py
    6. @Project: python
    7. @Feature:
    8. """
    9. import time
    10. import multiprocessing
    11. def taska():
    12. print("task a started")
    13. time.sleep(5)
    14. print("task a ended")
    15. def taskb():
    16. print("task b started")
    17. time.sleep(5)
    18. print("task b ended")
    19. def taskc():
    20. print("task c started")
    21. time.sleep(5)
    22. print("task c ended")
    23. if __name__ == "__main__":
    24. processa = multiprocessing.Process(target=taska)
    25. processb = multiprocessing.Process(target=taskb)
    26. processc = multiprocessing.Process(target=taskc)
    27. queue = [processa, processb, processc]
    28. for process in queue:
    29. process.start()
    30. process.join() # 阻塞

    同步非阻塞

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

    异步非阻塞

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

    1. """
    2. @Time: 2024/6/28 20:18
    3. @Author: 'Ethan'
    4. @Email: ethanzhou4406@outlook.com
    5. @File: 1. 同步阻塞.py
    6. @Project: python
    7. @Feature:
    8. """
    9. import time
    10. import multiprocessing
    11. def taska():
    12. print("task a started")
    13. time.sleep(5)
    14. print("task a ended")
    15. def taskb():
    16. print("task b started")
    17. time.sleep(5)
    18. print("task b ended")
    19. def taskc():
    20. print("task c started")
    21. time.sleep(5)
    22. print("task c ended")
    23. if __name__ == "__main__":
    24. processa = multiprocessing.Process(target=taska)
    25. processb = multiprocessing.Process(target=taskb)
    26. processc = multiprocessing.Process(target=taskc)
    27. queue = [processa, processb, processc]
    28. for process in queue:
    29. process.start()

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

  • 相关阅读:
    数据结构:红黑树讲解(C++)
    18. 四数之和
    Spring Boot 拦截器 HandlerInterceptor的使用以及WebMvcConfigurer简单介绍
    C语言之文件操作篇(2)
    Matlab论文插图绘制模板第122期—函数折线图(fplot)
    Leetcode刷题详解——寻找旋转排序数组中的最小值
    JAVA面试笔记
    一文了解HarmonyOSNEXT发布重点内容
    以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)
    行业资讯 | 入门revit软件需要理清哪些概念。
  • 原文地址:https://blog.csdn.net/baidu_38766791/article/details/140053388