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,random def 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) # 异步调用执行submit
l.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

总结

​ 同步和异步关注的是消息通信机制,说的是任务的发布与结果的回收;

​ 阻塞和非阻塞关注的是进程在等待调用结果时的状态,阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

Python学习之并发基础知识的更多相关文章

  1. Python学习第二节——基础知识

    # !/usr/bin/edv python    脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.# -*- coding:UTF-8 -*-    标明编码注释 ...

  2. Python学习笔记——1——基础知识

    1.1.变量和算法 python语言很类似人类语言,变量不需要定义类型.比如: 整型 字符串类型 数组 Java int a=12 String s="test" String[] ...

  3. python学习之-- Mysql 基础知识

    数据库介绍及MYSQL基础操作了解 关系型数据库(RDBMS)是按照数据结构来组织,存储和管理数据的仓库.特点:1:数据以表格的形式出现2:每行为各种记录名称3:每列为记录名称所对应的数据域4:许多的 ...

  4. (一)Python 学习第一天--基础知识,列表

    1. .pyc文件 .pyc文件:在python3中,当模块运行时会自动生成在_pycache_文件夹中,其中c为compiled的缩写. Python是一门现编译后解释的语言,在运行时首先寻找.py ...

  5. python学习笔记(一)-基础知识

    O.解释型语言和编译型语言 编译型语言就是先把写好的程序翻译成计算机语言然后执行,就是所谓的一次编译到处运行,比如c.c++就是编译型语言,这样的语言特点是运行速度快,但是需要事先把程序编译好才可以. ...

  6. Python学习课程零基础学Python

    python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...

  7. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  8. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  9. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

随机推荐

  1. 2019全国卷(III)理科23题的另类解法

    已知 $x,y,z\in\textbf{R}$且$x+y+z=1$ (1)求$(x-1)^2+(y+1)^2+(z+1)^2$的最小值: (2)若$(x-2)^2+(y-1)^2+(z-a)^2\ge ...

  2. ionic实现下载文件并打开功能(file-transfer和file-opener2插件)

    作为一款app,下载文件功能,和打开文件功能,在某些场景下还是十分有必要的.使用cordova-plugin-file-transfer和cordova-plugin-file-opener2这两个插 ...

  3. Kendo UI for jQuery使用教程:使用MVVM初始化(二)

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

  4. buuctf@ciscn_2019_en_2

    from pwn import * context.log_level='debug' io=process('./ciscn_2019_en_2') libc=ELF('./libc.so') el ...

  5. 15.DRF学习以及相关源码阅读

    1.http请求协议 代码很枯燥,结果和奇妙. 1.cbv django.vuews import View classs LoginView(View): def get(self,requset) ...

  6. 【CF963C】Cutting Rectangle(数论,构造,map)

    题意: 思路:考虑构造最小的单位矩形然后平铺 单位矩形中每种矩形的数量可以根据比例算出来,为c[i]/d,其中d是所有c[i]的gcd,如果能构造成功答案即为d的因子个数 考虑如果要将两种矩形放在同一 ...

  7. JavaWeb_初识过滤器Filter

    菜鸟教程 传送门 过滤器Filter::JavaWeb三大组件之一,它与Servlet很相似,过滤器是用来拦截请求的,而不是处理请求的 当用户请求某个Servlet时,会先执行部署在这个请求上的Fil ...

  8. DVWA--File Inclusion(不能远程包含的问题解决)

    然后别以为这样就完了 我被这样坑了一下午 找到你对应版本的php 进去Ctrl+f 搜索url_allow——fopen 和include

  9. DS博客作业08—课程总结

    1.当初你是如何做出选择计算机专业的决定的? 开始时我选择的专业就是网络/物联网,计算机专业是一个充满创造性的专业 2.对比开篇博客,哪些方面还存在哪些不足? 这个人就像戏台上的老将军,全身插满fla ...

  10. Vue可自定义tab组件

    在工作中我们常常要用到tab组件,如果有用第三方组件库的话一般都会有这个组件,但如果没有使用第三方组件库,或者想要自定义tab,那么或许这个无依赖的tab组件将会极大地节约你的开发时间.     如何 ...