前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python升级之路( Lv14 ) 并发编程初识

Python升级之路( Lv14 ) 并发编程初识

作者头像
时间静止不是简史
发布2022-09-23 17:22:56
3440
发布2022-09-23 17:22:56
举报
文章被收录于专栏:Java探索之路Java探索之路

Python系列文章目录

第一章 Python 入门

第二章 Python基本概念

第三章 序列

第四章 控制语句

第五章 函数

第六章 面向对象基础

第七章 面向对象深入

第八章 异常机制

第九章 文件操作

第十章 模块

第十一章 GUI图形界面编程

第十二章 pygame游戏开发基础

第十三章 pyinstaller 使用详解

第十四章 并发编程初识

并发编程介绍初识

前言

本章主要介绍了并发编程涉及的几个概念, 包括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发消息. 这一过程成为异步.


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python系列文章目录
    • 并发编程介绍初识
    • 前言
    • 什么是并发编程
      • 串行 & 并行 & 并发
        • 串行
        • 并发
        • 并行
      • 进程 & 线程 & 协程
        • 进程
        • 线程
        • 协程
      • 同步 & 异步
        • 同步
        • 异步
    相关产品与服务
    短信
    腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档