首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python_学习之并发编程

1、 概念普及2、进程&线程&协程2.1、进程函数的方式创建进程面向对象的方式创建进程守护进程进程间通信锁队列管道【很少使用】2.2、线程函数的方式创建:面向对象的方式创建:守护线程全局解释器锁GIL:2.3、协程创建猴子补丁进程与线程的区别线程与协程的区别1、 概念普及

并发编程的应用:

网络应用:爬虫(直接应用并发编程)

网络架构django、flask、tornado 源码-并发编程

socket server 源码-并发编程

计算机操作系统发展史

手工操作-读穿孔的纸带、用户独占全机、cpu等待手工操作、cpu利用不充分

批处理-磁带存储(联机批处理、脱机批处理、只能运行一个程序,遇到IO就等待闲置

多道程序系统

同时执行多个任务,遇到io就切换,

即空间隔离(多个程序运行),时空复用(IO切换)的特点

分时系统

同时执行多个任务,没有遇到IO也切换,固定时间片到了就切

时间片轮转

多路性、交互性、独立性、及时性

切会浪费cpu时间,降低了cpu效率,但提高了用户体验。

实时系统

及时响应

高可靠性

时刻等待响应,即时处理

通用操作系统:

多道批处理

分时

实时

操作系统分类:

个人计算机操作系统

网络操作系统

分布式操作系统

操作系统的作用:

是一个协调、管理、和控制计算机硬件资源和软件资源的控制程序。【调度硬件资源、调用管理软件】

隐藏了丑陋的硬件调用接口,提供良好的抽象接口

管理、调度进程,并将多个进程对硬件的竞争变得有序

I/O操作:(相对内存来说的)

输入【读到内存中】:input、f.read、accept、recv、connect

输出【从内存读出】:print、f.write、send、connect

文件操作/网络操作都是IO操作

异步:两个任务同时运行(并行)

同步:多个任务 串行 【按顺序执行】

阻塞:等待 input、accept、recv

非阻塞:不等待,直接执行

并行:多个任务同时执行【多个CPU在同时执行任务】

并发:只有一个CPU,交替执行多个任务【宏观上同时执行,实际是轮转】,两则区别可参见:【转】编程概念篇-并发与并行

同步执行:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行

异步执行:一个进程在执行某个任务时,另外一个进程无需等待其执行完毕,就可以继续执行,当有消息返回时,系统会通知后者进行处理,这样可以提高执行效率

程序:没有运行

进程:运行中的程序、计算机中最小的资源分配单元

进程调度:

多个进程(运行中的程序)在操作系统的控制下被CPU执行,去享用计算机资源

先来先服务调度算法

短作业优先

时间片轮转

多级反馈队列

进程调度的过程是不能随意被程序影响得

进程三大状态

就绪 程序开始运行,进入就绪队列,等待cpu分配时间

运行 执行进程,单个时间片内运行完成,就释放资源,没有作业完,就又自动切换到就绪队列等待下次的调度

阻塞 执行中的进程遇到事件入IO等导致无法执行,进入阻塞状态,解除后进入就绪队列等待进程调度

进程与父进程

进程 PID   通过os.getpid()  可以得到

父进程 PPID 负责回收一些子进程的资源后才关闭  通过os.getppid()

2、进程&线程&协程2.1、进程

定义:计算机最小的资源分配单元【一个软件正在进行的过程,】

特点:

进程与进程之间内存中的数据是隔离的

进程与进程之间不能自由的交换内存数据【内存空间是不能共享的】

全局变量在子进程中修改,其他进程是感知不到的【子进程的执行结果父进程是获取不到的】

进程间通信需要通过队列【管道+锁】或管道

创建进程:

系统初始化

一个进程在运行过程中开启了子进程

用户的交互式请求,而创建一个新进程

一个批处理作业的初始化

函数的方式创建进程

面向对象的方式创建进程

守护进程

特点:守护进程的生命周期只和主进程的代码有关系,和其他子进程没有关系,会随着主进程代码执行结束而结束

作用:监控主进程生命状态

注意点:

主进程创建的守护进程

守护进程内无法创建子进程

守护进程属性,默认False

配置守护进程应该在主进程开子进程之前即之前

进程间通信

进程间数据交互,本质是socket通信,不过都是本地的,基于文件。

作用:保证多个进程修改同一数据源时,同一时间只能有一个任务可以进行操作,保证安全性,损失效率

语法:

示例:

队列

特点:先进先出

本质:管道+锁

语法:

示例:

管道【很少使用】

特点:左放右收或左收右放,全双攻模式

注意点:

进程间通信,数据不安全,队列安全

需要在创建子进程前创建

2.2、线程

定义:CPU调度的最小单位

特点:

依赖于进程

独立调度和分派的基本单位(线程间切换快,开销小)

共享进程资源,同一进程内线程间可通信

并发执行

常用方法:

函数的方式创建:

面向对象的方式创建:

示例:线程间数据共享,可修改全局变量,不加锁也不安全

守护线程

特点:随主线程运行结束而结束,不同于守护进程,随主进程代码结束而结束

全局解释器锁GIL:

同一个进程里的每一个线程同一时间只能有一个线程访问cpu,锁的是线程,而不是具体的内存,但并不妨碍多个进程同时访问数据,这将导致访问同一数据不安全现象

队列和栈

定时器

2.3、协程

定义:用户态的轻量级线程,由用户创造与控制协程间的切换

特点:

依赖线程

可以无限执行,充分利用cpu,尽量规避了IO,其遇到io就自动切换到另一个线程

开销比线程还小

基于yield或yield from创建

基于gevent创建

猴子补丁

解决非gevent识别的io阻塞,放在顶行

进程与线程的区别

线程依赖于进程,进程负责获取资源,线程负责执行任务

每个进程中至少有一个线程

多进程之间内存相互隔离,多线程之间共享同一进程数据

进程不能自由通信,需借助管道,队列等工具,线程可以自由通信

多进程开销大,多线程开销小

线程与协程的区别

线程的切换由操作系统控制调度,协程由用户【开发者】自行控制调度

线程开销比协程大,协程通过gevent可实现切换无开销

线程依赖于进程,协程依赖于单线程

线程协程都无法利用多核

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210319A00W7F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券