Nrich's blog Nrich's blog
首页
  • Java
  • Golang
  • 深度学习
  • Git
  • Linux
  • DataStructure
  • CloudNative
  • Redis
  • MySQL
  • 路由劫持
GitHub (opens new window)

Nrich

小聪明
首页
  • Java
  • Golang
  • 深度学习
  • Git
  • Linux
  • DataStructure
  • CloudNative
  • Redis
  • MySQL
  • 路由劫持
GitHub (opens new window)
  • Java

    • 黑马Java入门基础-学习笔记

      • Java 基础语法
      • 数组
      • 方法
      • 面向对象基础
      • 常用API(String、ArrayList)
      • 面向对象进阶1(static、单例、代码块、继承)
      • 面向对象进阶2(包、权限修饰符、抽象类、接口)
      • 面向对象进阶3(多态、内部类、常用API)
      • 面向对象进阶4(常用日期API、正则、Arrays类、Lambda)
      • 面向对象进阶5(集合体系)
      • 面向对象进阶6(集合体系之Map)
      • 面向对象进阶-补充(可变参数)
    • 面向对象
    • 常用API
    • 并发、并行、异步、同步(暂存)
      • 1. 并发 VS. 并行(parallelism)
      • 2. 同步 VS. 异步
        • 2.1 多线程编程(Multi-threading) VS. (单线程)异步编程(Asynchronous Programming)
        • 2.2 异步编程
    • 《Spring Boot 进阶-郑天民》

  • GoLang

  • 开发
  • Java
Nrich
2022-04-07
目录

并发、并行、异步、同步(暂存)

# 1. 并发 VS. 并行(parallelism)

并发单纯代表计算机能同时执行多项任务,具体怎么实现的会有多种形式。

  • 单核:分配时间片,进程或线程进行上下文切换,实现并发。
  • 多核:多核处理器上,可以在不同的核心上真正并行地执行任务。

# 2. 同步 VS. 异步

  • 同步:必须等前一个任务完毕之后才能开始下一个任务,没有并发、并行的概念。

  • 异步:不同任务之间不互相等待,直到任务完成之后才回来通知你。

    典型实现方式:多线程。

    • 若在多核心上运行,则不同线程分配到不同的核心上运行。
    • 若在单核心上运行,或通过设置亲和力(Affinity)强制将线程绑定到某个核心上,则会通过分配时间片的方式进行并发地执行各个线程。

    python 的 asyncio 就是原生的异步编程方式,

# 2.1 多线程编程(Multi-threading) VS. (单线程)异步编程(Asynchronous Programming)

  • 多线程编程:适合计算量密集的应用。视频、图像处理、科学计算等,不让 CPU 核心消耗在无畏的等待上。

image-20220407153944836

  • 异步编程:I/O密集型程序应用异步编程。

    用多线程编程容易造成资源浪费,各个线程都会处于等待 I/O 操作的过程中,线程自身会占用额外内存,并且线程之间的切换会有额外的开销,以及线程之间的资源竞争问题。

image-20220407153925121

# 2.2 异步编程

不同任务之间不互相等待,直到任务完成之后才回来通知你,通常以回调函数(callback)的方式来通知你。这种编程模式避免了程序的阻塞,提高了 CPU 执行效率。尤其适用 I/O 密集、操作数据库、访问文件等操作。

  • Promise (承诺) : 寓意这个去这个请求会在未来某一个时刻返回

    解决了回调地狱的问题

    例如: fetch 向服务器请求,返回Promise对象,渲染前端,如果可以使用 then 进行接受返回的结果

fetch("https://www.woshishuaige.om").then((res)=>{

})
1
2
3
  • async / await

    用 async 标记一个函数为异步函数,在这样的函数中,可以用 await 来调用其他的异步函数,这样避免了用 Promise , 以及一系列的 then 等等。

    不能在全局和普通函数中使用 await 关键字,只能被应用异步,所以想要使用 await 就必须用 async 修饰函数。

编辑 (opens new window)
上次更新: 2023/05/17, 13:14:17
常用API
Spring依赖注入原理

← 常用API Spring依赖注入原理→

最近更新
01
YAML、Pod、Job、CronJob、ConfigMap、Secret
06-06
02
Kubernetes 的安装与基本架构
06-04
03
初识容器
05-30
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Nrich | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式