Python系列文章目录

第一章 Python 入门
第二章 Python基本概念
第三章 序列
第四章 控制语句
第五章 函数
第六章 面向对象基础
第七章 面向对象深入
第八章 异常机制
第九章 文件操作
第十章 模块
第十一章 GUI图形界面编程
第十二章 pygame游戏开发基础
第十三章 pyinstaller 使用详解
第十四章 并发编程初识

并发编程介绍初识

  • Python系列文章目录
  • 前言
  • 什么是并发编程
    • 串行 & 并行 & 并发
      • 串行
      • 并发
      • 并行
    • 进程 & 线程 & 协程
      • 进程
      • 线程
      • 协程
    • 同步 & 异步
      • 同步
      • 异步

前言

本章主要介绍了并发编程涉及的几个概念, 包括cpu执行任务的三种方式: 串行, 并行, 并发.程序的三种存在形式: 进程, 线程, 协程以及相关衍生概念. 再加上消息通信的两种方式: 同步, 异步

什么是并发编程

串行 & 并行 & 并发

串行

一句话概: 一个CPU上,按顺序完成多个任务

串行图解:

并发

一句话概括: 一个cpu上, 交替执行多个任务

并发图解:

并行

一句话概括: 多个cpu上, 同时执行多个任务(任务数<=CPU核数)
并行必须有多cpu才能实现,否则只能实现并发(伪并行)

并行图解:

串行, 并行, 并发总结如下:

  • 串行: 一个CPU上,按顺序完成多个任务
  • 并行: 多个cpu上, 同时执行多个任务(任务数<=CPU核数)
  • 并发: 一个cpu上, 交替执行多个任务

进程 & 线程 & 协程

进程

进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例.
程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行.

进程的优点:

  • 可以使用计算机多核,进行任务的并行执行,提高执行效率
  • 运行不受其他进程影响,创建方便
  • 空间独立,数据安全

进程的缺点:

  • 进程的创建和删除消耗的系统资源较多

线程

线程是程序执行时的最小单位,也是CPU调度和分派的基本单位.
一个进程可以由很多个线程组成,拥有自己独立的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度.
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行. 同样多线程也可以实现并发操作,每个请求分配一个线程来处理.

多线程
多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程编程能够最大限度的利用CPU的资源: 如果某些线程不需要占用CPU时间片时, 可以让出当前时间片, 让其他线程获取到CPU资源. 以此来达到最大限度利用CPU资源的目的. 这个过程也被成为上下文切换.

线程生命周期
线程主要有“新建”(NEW)、“就绪”(RUNNABLE)、“运行”(RUNNING)、“阻塞”(BLOCKED)、“死亡”(DEAD)** 五种状态. 各状态间的转换如下图所示:

注意事项:

  • 在运行过程中,线程由就绪态(RUNNABLE )转为非就绪态(BLOCKED )的过程就是线程上下文切换
  • 线程的状态由运行转为阻塞 ,再由阻塞转为就绪 ,然后再被调度器选中执行,这就是一个上下文切换的过程
  • 当一个线程从运行状态转为阻塞状态时,我们称为一个线程的暂停,线程暂停被切出之后,操作系统会保存相应的上下文,以便这个线程稍后再次进入就绪状态时能够在之前执行进度的基础上继续执行
  • 当一个线程从阻塞状态进入到就绪状态时,我们称为一个线程的唤醒,此时线程将获取上次保存的上下文继续完成执行
  • 频繁的上下文切换会带来系统开销, 因此会导致系统性能下降. 所以我们在使用多线程是应该尽量避免出现上下文切换.

协程

协程也叫作纤程(Fiber),是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理.
我们可以将协程理解为运行在线程上的代码块, 协程挂起并不会引起线程阻塞, 他的作用是提高线程的利用率…
协程之间可以依靠邮箱来进行通信和数据共享, 了避免内存共享数据而带来的线程安全问题.
因为其轻量和高利用率的特点, 即使创建上千个线程也不会对系统造成很大负担, 而线程则恰恰相反.
协程是一种设计思想,不仅仅局限于某一门语言. 在Go, Java, Python 等语言中均有实现

协程的核心(控制流的让出和恢复)

  • 每个协程有自己的执行栈,可以保存自己的执行现场
  • 可以由用户程序按需创建协程(比如:遇到io操作)
  • 协程“主动让出(yield)”执行权时候,会保存执行现场(保存中断时的寄存器上下文和栈),然后切换到其他协程
  • 协程恢复执行(resume)时,根据之前保存的执行现场恢复到中断前的状态,继续执行,这样就通过协程实现了轻量的由用户态调度的多任务模

进程和线程之间的区别

  1. 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.
  2. 线程可以看成是轻量级的进程,属于同一进程的线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小.
  3. 线程和进程最根本的区别在于:进程是资源分配的单位,线程是调度和执行的单位.
  4. 多进程: 在操作系统中能同时运行多个任务(程序).
  5. 多线程: 在同一应用程序中有多个顺序流同时执行.
  6. 线程是进程的一部分,所以线程有的时候被称为轻量级进程.
  7. 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的.
  8. 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源.

线程, 进程, 协程之间区别如图所示:

同步 & 异步

同步和异步强调的是消息通信机制

同步

同步(synchronous):A调用B,等待B返回结果后,A继续执行.
在同步的过程中, 存在一个等待的状态. 即: 某个事情执行时需要等待另一个个事情的结果, 才能继续向下执行.

以打电话为例:
A向B打电话时, 发出电话邀请, 只有B同意接听之后才会进行通话, 否则会一直处于等待状态(阻塞). 这一过程称为同步.

异步

异步(asynchronous ):A调用B,A继续执行,不等待B返回结果;B有结果了,通知A,A再做处理.

以发短信为例:
A在给B发消息, 无需等待B的反馈, 便可以给C发消息. 这一过程成为异步.


Python升级之路( Lv14 ) 并发编程初识相关推荐

  1. python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  2. python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四)

    大家好,并发编程进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 .前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程无非 ...

  3. 疯狂python讲义学习日志11——并发编程

    作为高级编程范畴的重要组成部分,并发编程在编码中有着很大的应用,许多工程师收益于并发编程带来的高效福利.但是并行编程是有一定难度的,本章将和大家一起从入门开始,详细介绍在python中如何进行并行编程 ...

  4. Java并发编程——初识JUC

    文章目录 初识JUC 一.什么是JUC 二.进程和线程 2.1 进程和线程 2.2 并行和并发 2.3 Java线程有几个状态 2.4 wait/sleep的区别 初识JUC 一.什么是JUC JUC ...

  5. Python学习-基础篇8 并发编程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  6. python互斥锁原理_python并发编程之多进程1------互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  7. python 异步io框架_Python并发编程之学习异步IO框架:asyncio 中篇(十)

    大家好,并发编程 进入第十章. 好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了. 为了更好地衔接这一节,我们先来回顾一 ...

  8. Python升级之路( Lv11 ) GUI图形界面编程

    Python系列文章目录 第一章 Python 入门 第二章 Python基本概念 第三章 序列 第四章 控制语句 第五章 函数 第六章 面向对象基础 第七章 面向对象深入 第八章 异常机制 第九章 ...

  9. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

最新文章

  1. 你真的了解Grid布局吗?
  2. Android SlidingMenu 开源项目 侧拉菜单的使用(详细配置)
  3. 逻辑分析推理(五小姐问题)
  4. springboot下使用mybatis配置
  5. 用户登录验证(新增帐号错误重试)
  6. 副本的leader选举
  7. nginx系列之八:使用upsync模块实现负载均衡
  8. 数据库设计(一对一、一对多、多对多)
  9. electron 5.0.3版本 改动的地方
  10. 人工智能在fpga的具体应用_人工智能带动了FPGA的发展
  11. 流程建设过程中个人和团队可能面临的问题
  12. 读书 | 巴比伦最富有的人(内含思维导图)
  13. 车牌归属地 API数据接口
  14. 史上最全数据库笔记(上)
  15. 工程项目管理系统-专注项目数字化管理-工程管理
  16. linux服务器忘记ssh密码_Linux 忘记密码解决方法,Linux 远程登录
  17. 前台CSS样式使用小结
  18. Java生成树型结构
  19. LNK2019 无法解析的外部符号“XXX”()中引用了该符号,原因之一
  20. Java【记录record】

热门文章

  1. 2PC/3PC到底是啥
  2. recurdyn履带问题
  3. linux系统uptime解读,linux uptime和系统负载
  4. 传感器信号 如何发送到服务器,传感器采集到的数据通过无线传输至监控服务器的四种方式...
  5. suid提权(linux)
  6. 内部类与静态内部类区别及举例
  7. 惠普打印机,打印显示需要用户干预,怎么办
  8. 花生壳内网穿透发现突然连接不上了(请检查内网主机IP和端口)
  9. Windows开启监控
  10. 智能车心得分享(六)-- 电磁入环