8 并发编程

8.1 基础知识

8.1.1 操作系统的定义

操作系统是存在于硬件与软件之间,管理、协调、调度软件与硬件的交互。

资源管理解决物理资源数量不足和合理分配资源这两个问题,

通俗来说,操作系统可以分成两部分功能:

​ 一是将硬件资源接口的调用变得方便简单;
​ 二是合理调度应用程序对硬件资源的竞态请求

8.1.2 进程

具有独立功能的程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。

正在执行的文件或程序,而负责执行的主体使CPU。

8.1.3 进程与程序

​ 程序可以说是一些文件或者代码等指令的集合,程序不能单独执行,只有把程序加载到内存中,系统为它分配资源之后才能执行,而程序的执行就叫线程,进程包括程序、数据集和进程控制三个模块,是操作系统进行资源分配和保护的基本单位。

​ 把一个程序在一个数据集上的依次执行称为一个进程。程序是静态的指令集合,而进程是动态的。

​ 同一个程序同时执行两次也是两个进程。

8.1.4 并行与并发

并发:

​ 一个处理器同时处理多个任务;由CPU的多道技术实现,是逻辑上的同时发生,微观上仍是同一时刻只能执行一个任务,只不过CPU利用多道技术在多个任务键来回切换执行,而切换执行的时间差,我们无法察觉,宏观上感觉是多个任务同时发生。

并行:

​ 指在同一时刻,有多条指令在多个处理器上同时执行,物理上真正实现多任务同时执行。

多道技术:对单个CPU而言,空间上复用,内存中同时存入多道程序;时间复用,cpu在多个进程间快速切换(一是遇到io,二是执行一定的时间),使每个进程各自运行一定的时间。

【重要概念】

​ 串行:所有的进程由CPU一个一个的执行
​ 并发:单个cpu同时执行多个进程(来回切换),看起来像是同时运行
​ 并行:多个cpu真正的同时运行多个程序
​ 阻塞:遇到IO(write input read sleep recv accept)才叫阻塞
​ 非阻塞:没有IO

8.1.5 同步/异步&阻塞/非阻塞(重要)

线程

进程是负责程序执行的执行单元,一个进程中至少有一个线程。

线程与进程的区别:

  • 进程是资源分配和调度的独立单元,线程是CPU调度的基本单位
  • 同一个进程中可能有多个线程,这些线程共享进程的资源,每个线程并行执行不同的任务
同步

发出一个功能调用时,在没有得到结果之前,该调用就不返回

【常规用法】

  • multiprocessing.Pool下的apply 发起同步调用命令后,一直等到任务结束
  • concurrent.futures.ProcessPoolExecutor().submit(func,).result()
  • concurrent.futures.ThreadPoolExecutor().submit(func,).result()
异步

与同步概念相对,当异步功能调用后,调用者没有立即得到结果,而是等到异步功能完成后,通过状态、通知或者回调函数来通知调用者

【常规用法】

  • multiprocessing.Pool().apply_async() 发起异步调用,并不会等待任务结束,只是得到一个对象,该对象是可变的,最终变成执行结果
  • concurrent.futures.ProcessPoolExecutor(3).submit(func,)
  • concurrent.futures.ThreadPoolExecutor(3).submit(func,)
from concurrent.futures import ProcessPoolExecutor
import os,time,randomdef f():print(f"{os.getpid()} is runing")time.sleep(random.randint(1,3))return f"{os.getpid()} is done "if __name__ == '__main__':p = ProcessPoolExecutor(max_workers=4)l = []sta1 = time.time()for i in range(10):obj = p.submit(f)   #  异步调用执行submitl.append(obj)print(f'take {time.time()-sta1} times')  # 时间非常短time.sleep(4)sta2 = time.time()for j in l:print(j.result())   # 每一个result都是同步调用print(f'take {time.time() - sta2} times')  # 总耗时时间比较长
阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起,如遇到IO操作,调用函数只有在得到结果之后才会将阻塞的线程激活

非阻塞

与阻塞的概念相对,指在不能立即得到结果之前也会立刻返回,同时该函数不会阻塞当前线程,程序没有遇到IO或者遇到IO后通过协程让CPU去执行本线程里的其他任务,尽可能占用CPU

总结

​ 同步和异步关注的是消息通信机制,说的是任务的发布与结果的回收;
​ 阻塞和非阻塞关注的是进程在等待调用结果时的状态,阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

转载于:https://www.cnblogs.com/jjzz1234/p/11233388.html

Python学习之并发基础知识相关推荐

  1. Python学习6 字典基础知识和常用函数

    字典概念 字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据.为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 ...

  2. python学习记录(基础知识+案例实现)

    day01 1.变量 """ 变量在内存中创建一个空间,专门存储数据name = zhangsan命名规范不能以数字.特殊字符开头,不能以关键字命名英文单词.数字.下划线 ...

  3. Python学习5 元组基础知识和常用函数

    元组概念 元组:a=(1,23) 列表:a= [1,23] 创建和访问元组 Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串. 元组与列表类似,也用整数来对 ...

  4. Python学习4 列表基础知识和常用函数

    列表 1.格式 2.增删改查 列表下标: 0–n-1 -n-(-1) #对列表进行切片 #0-(n-1) #-n-(-1) list=['dq','python','mm'] print(list[0 ...

  5. Python学习之路-基础知识1

    永远的Hello World! print("Hello World!") >>Hello World! 数据类型 Number类型: 数值类型,用于存储数字 Inte ...

  6. Python学习笔记(基础知识第三篇:列表、元组、字典、集合)

    一.列表 1.列表知识 定义一个空的列表,列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套). 打印出第一个元素,列表索引值以0为开始值,-1为从末尾的开始位置. 列表可以使用 ...

  7. Python学习之路-基础知识2-文件操作

    文件操作     现有文件test.txt内容如下: 床前明月光, 疑是地上霜. 举头望明月, 低头思故乡. >>>f = open("test.txt",&qu ...

  8. 学python需要什么基础知识-没学过Python先要学习哪些基础知识?

    零基础学Python应该学习哪些入门知识 关于零基础怎么样能快速学好Python的问题,百度提问和解答的都很多,你可以百度下看看.我觉得从个人自学的角度出发,应从以下几个方面来理解: 1 为什么选择学 ...

  9. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并

    OpenCV与图像处理学习一--图像基础知识.读入.显示.保存图像.灰度转化.通道分离与合并 一.图像基础知识 1.1 数字图像的概念 1.2 数字图像的应用 1.3 OpenCV介绍 二.图像属性 ...

最新文章

  1. c语言stm8变量存储类型,STM32存储资源分配解析
  2. 我们需要现在就进入LTE时代
  3. python3 sys.stdout.write print 区别
  4. flink sql udf jar包_Java动态加载Jar实例解析
  5. 模拟实现priority_queue优先级队列
  6. 北森完成2.6亿美金融资,一体化×低代码引领HR数字化风潮
  7. 演练 影视演员简介 0929
  8. 自助式BI对比评测:Tableau和FineBI
  9. c++注释快捷键_是不是晚了点:Visual Studio可以自动生成注释啦!
  10. hive explain 源码分析
  11. 测试理论基础(思维导图)
  12. Circumventing Group Policy Settings
  13. 金山WPS服务器JAVA开发试卷题目
  14. 第三集 怪物学院 第十七章
  15. “我和刘德华直到现在都没离婚”-喻可欣坚称与刘德华已结婚
  16. javaScript和html的区别与联系
  17. java listiterator_Java笔记--Java的List、Iterator用法
  18. 前端萌新看过来了—— 0基础1小时vue入门到实战
  19. SOA 微服务 RPC WebService Soap关系详解
  20. SecureCRT安装配置使用

热门文章

  1. Ognl标签常用例子 只能在Struts2中使用
  2. Mybatis-Plus入门之通用CRUD+基本配置介绍
  3. 使用netty搭建一个简单的聊天室
  4. [转]Vi 教程(Unix行编辑器)
  5. 深究AngularJS——ng-checked(回写:带真实案例代码)
  6. c# 访问hbase_大数据技术 windows下C#通过Thrift操作HBase
  7. 诺曼门的十个产品_用户决策与产品设计
  8. 电脑关机慢是什么原因_为什么电脑无法关机?电脑无法正常关机的解决方案
  9. 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3
  10. php麻将机器人ai算法,高性能麻将AI算法