之前在码农翻身上看到一篇讲解线程、进程和协程的文章,觉得写得很好,所以搬过来学习一下。

学习内容:《一个故事讲完进程、线程和协程》

Learning Card

阶段一:

背景:CPU是稀缺资源,程序必须排队轮流使用

批处理: 程序A执行完成后,程序B再执行

阶段二:

背景:CPU速度越来越快,批处理效率太低,资源浪费太大

进程:一个执行中的程序,它可以暂停下来,暂停的地方即执行到哪一行程序指令了,是这个进程的执行现场,暂停之后再次执行时,从执行现场开始继续。程序之间是相互交替执行的。
并发:由于CPU的运行速度特别快,虽然程序再不断切换运行,但看起来像是在同时执行
并行:每个程序能够占用一个CPU,真正地同时执行
线程:程序中的单一的顺序控制流程,是最小的调度单位。每个程序都至少有一个线程,如果只有一个线程,就是程序本身;也可以同时运行多个线程完成不同的工作,成为多线程

阶段三:

背景:多线程的协作有时会比较麻烦,需要加锁和线程的通知、等待等。

协程:比线程更加轻量级,它就像是有多个轻量级的线程,它们之间会切换控制权,控制权在谁手里,谁就执行

协程近几年在Lua和Python中应用比较多。


为了方便记忆,我整理了一下以上知识点。

一个程序一个进程
程序里面还有线程
一个线程叫单线程
多个线程叫多线程
线程里还能有协程

一个CPU配多个进程叫并发
每个进程配一个CPU叫并行

Learning Card

Set和Map是ES6新添加的两个数据结构。

  • Set
    • 类似数组,没有重复值
    • 与数组相关方法
      • new Set(array) 利用数组元素生成Set[...set]实现数组去重
      • Array.from(set) 转换成数组
    • 属性
      • constructor 构造函数
      • size 成员个数
    • 方法
      • add(value) 添加值
      • delete(value) 删除值
      • has(value) 判断是否包含某值
      • clear() 清除所有成员
  • Map
    • 类似对象,键可以是任意数据类型
    • 属性
      • size 成员个数
    • 方法
      • set(key, value) 设置某个键的值
      • get(key) 读取某个键的值
      • has(key) 判断是否有某个键
      • delete(key) 删除某个键,返回布尔值,表明是否删除成功
      • clear() 清空所有成员
    • 与其他数据结构互转
      • Map => 数组 使用扩展运算符...
      • 数组 => Map 将数组传入Map构造函数
      • Map => 对象 函数将键值对传入对象
      • 对象 => Map 函数设置Map对象的每个键
阅读全文 »

Learning Card

  • 函数参数的默认值

    • 可以直接为函数指定参数的默认值
    • 参数严格等于undefined时默认值生效
    • 指定默认值的参数应作为尾参数
    • 函数参数的length属性不包括默认值参数
  • rest参数

    • 写法: …变量名
    • 用来获取多余的参数
    • 是一个真实的数组
    • rest参数之后不能有其他参数
    • length属性不包括rest参数
  • name属性

    • 返回函数的函数名
  • 箭头函数

    • function改为=>
    • 当函数不需要参数或者需要多个参数时,使用()来包含参数,只有一个参数时可以省略圆括号
    • 如果箭头函数的代码块部分多余一条语句,用{}括起来,使用return返回;如果只有一条语句,可以省略{}和`return
    • this总是指向定义时的对象
阅读全文 »

Learning Card

  • 扩展运算符
    • 写法: ...
    • 用途:将数组转为参数序列
    • 应用
      • 复制数组
      • 合并数组
      • 转换字符串
  • 数组的新方法
    • Array.from()
      • 将类似数组的及有遍历接口的对象转换成数组
    • Array.of()
  • 数组实例的新方法
    • copyWith(target, start, end)
      • 复制数组内的元素到特定位置
    • find
      • 找到第一个符合条件的元素
    • findIndex
      • 找到第一个符合条件的元素的位置
    • fill()
      • 填充数组
    • keys(), values(), entries()
      • 遍历数组的键名、键值、键值对
    • includes
      • 检查数组中是否包含某个元素
阅读全文 »

Learning Card

  • 新特性
    • 属性的简洁表达法
      • 可以直接写入变量和函数
      • 即先给属性赋值,再将属性添加到对象中
    • 属性名表达式
      • 可以在大括号{}中使用方括号属性名[]
    • 方法的name属性
      • 即函数的name属性
  • 新方法
    • Object.is()
      • 判断两个值是否严格相等
    • Object.assign()
      • 用于合并对象
阅读全文 »

Learning Card

ES6中的正则表达式有这样一些改变:

  • RegExp构造函数的写法有了更新
    • 可以是正则表达式+修饰符
  • 新的修饰符
    • u修饰符 Unicode模式
    • y修饰符 “粘连”修饰符
  • 新的属性
    • unicode属性 判断是否设置了u修饰符
    • sticky属性 判断是否设置了y修饰符
    • flags属性 返回正则表达式的修饰符
  • 新规则
    • 后行断言
      • 先行断言写法 /x(?=y)/
      • 先行否定断言写法 /x(?!y)/
      • 后行断言写法 /(?<=y)x/
      • 后行否定断言写法 /(?<!y)x/
    • 具名组匹配 给分组添加名字
阅读全文 »

  • Learning Card

    ES6中,字符串有了以下变化:

    • 新特性

      • 增加了遍历器接口,可以被for...of来遍历
    • 模板字符串

      • 用反引号标识字符串
      • 字符串可以转行
      • 字符串可以嵌入变量
    • 新方法

      • 判断字符串 includes(), startsWith(), endsWith()

      • 创建字符串 repeat()

      • 修改字符串 padStart(), padEnd()

阅读全文 »

Sass (Syntactically Awesome StyleSheets)是CSS语言的扩展。它拥有一些原生CSS不能实现的功能,让项目的样式代码变得更为简单,更容易维护。

Sass本质上是一个编译器,它使用Sass语法写代码,然后转换成CSS语言,因此我们在使用的时候可以创建变量、嵌套CSS规则、引入其他的Sass文件,这使得代码更紧凑,也更容易阅读。

阅读全文 »

当我们每次打开命令行工具,需要进入到新的文件夹的时候,我们都要不停地cd或者ls来判断我们是否进入了正确的文件夹,如果我们能记住文件夹的路径还好,如果记不住(比如我最近开始学MongoDB,总是记不住安装路径),那就不得不反复地cd ls cd../来查找文件了。

不过最近意外地发现了一个很好用的插件,简直就是人间利器,就是这个叫做autojump的插件,附上github地址.

当我们安装autojump之后,只要我们进入一次某个文件夹,插件就会记住这个路径,之后我们只需要

1
j project

就可以跳转到project文件夹,不仅如此,我们还可以使用简写来替代文件名,如

1
j p

总之,在跳转文件路径这件事上,autojump真的是太方便了!

0%