content

  1. What is asynchronous programming? (JavaScript) 1.1 怎么在JavaScript中进行异步编程?
  2. 其他语言的异步编程
  3. 多线程编程 (c++) a. 什么是多线程?与硬件的关系是什么? b. 使用多线程意味着什么? c. 使用多线程的目标是什么?
  4. 其他语言的多线程编程
  5. 多线程与异步编程的关系 (主要讲GoRotine,分析源码,看一下rust有没有改进)
  6. GPU并行编程

introduction

background

我们这个系列主要是讲异步和多线程。异步和多线程本质上来讲都是为了充分的利用计算资源。

当CPU单核主频的发展速度达到瓶颈之后,往多核CPU发展。同时GPU的并行运算给LLM的发展有着极大的促进作用。当然我这一个系列主要是讲CPU,这里我只是想表明并行计算这个概念在现在这个时代非常重要。

那么异步编程是指什么?它和多线程是什么关系?多线程与硬件的关系是什么?异步编程&多线程编程与并行计算又有什么关系?我们将通过这个系列搞清楚这些问题。

我将会不定期的更新这个系列的文章

in this article

在这篇文章里面我会介绍: 1. JavaScript中的异步编程 b. promise c. await 2. 怎么判断IO操作有没有结束?(源码) a. 网络操作 b. 文件操作 c. 有没有浪费资源呢? 对于cpu来讲是没有的,因为就算

实验环境

OS: Windows 11 21H2 22000.2538

Node.js: 20.13.1

Promise

为什么要讲promise?

代码github链接

画流程图,标注一下与回调函数的关系 callbacks

解释

await

“async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise,如果正常return,就是resolve(returned value),如果异常或者主动返回一个reject了的promise也可以触发reject

await 接受thenable(什么是thenable,只要这个对象具有符合 Promise/A+ 规范的 then 方法即可),如果不是thenable,是具体的值,会立刻解决

await只能和async配合使用,async可以单独使用。

怎么判断IO操作有没有结束?(源码)

网络操作

文件操作

异步真的没有浪费资源吗?

事实上在同步编程里面,如果某线程傻傻等待不做任何事件,CPU也不会浪费资源,因为操作系统会把CPU的时间片分配给其他的进程。但这就是操作系统层面的调度了,但是对于线程层面的调度来讲,还是需要异步操作。那么对于进程层面的调度呢?是可以用多线程来解决的,但是比较麻烦。其实异步操作里面大都用了多线程,异步操作和多线程的关系还是很紧密的。简单来讲,现在的异步操作同时大大简化了多线程的管理。

在讲多线程之前,我们会浏览一下异步操作在其他编程语言上的实现。更有利于我们去了解异步与多线程之间的关系。

relative resources

GPU programming from Jim Fan


Comments

comments powered by Disqus