像 Javascript 一样工作

August 30, 2014

开博第一篇, 抱怨一下最近的工作被诸多繁杂的任务所充斥, 往往一件任务没有结束, 新的任务又急需开展, 大脑同时在多件事物中切换, 使得身心俱疲, 工作效率随之降低, 目标感变弱. 与朋友聊起此事, 开玩笑道自己是单进程却需要处理并发请求, 把自己比作 Javascript, 猛然惊觉, 为什么不能像 Javascript 一样工作呢?

在此不能不提 Javascript 的单线程机制和定时器的原理.

Javascript 运行在浏览器中, 是单线程的, 即每个 windows 中只有一个 Javascript 线程正在执行. 这就意味着, 同一时间只有一条代码正在被执行. 那 Javascript 是如何处理异步事件 (对外容易让人产生并发的错觉)? 答案很简单, 队列机制. 当一个异步事件被触发时 (鼠标点击事件, Ajax响应事件, 计时器事件), 如果当前有其他任务正在执行, 该异步事件将会被阻塞, 而排在队列的尾部, 直到队列之前的任务都执行结束.

举一个例子

settimeout(10, function() {
     // 执行代码
});

// 继续执行

// 执行到此处, 有一个用户点击事件被触发

// 执行到此处, 已经运行10ms, 定时器事件被触发

以上代码首先设置了一个定时器任务, 在10ms后触发, 代码会继续执行. 在执行的过程中, 有一个用户点击的事件触发, 该事件被加入到队列中等待执行. 代码继续执行, 当运行时间超过10ms时, 定时器事件将被触发, 该事件也被阻塞加入到队列中等待执行.

直到以上代码执行完成, 队列移动到下一个任务, 用户点击的事件的回调方法将会执行. 同理执行完成之后, 定时器事件的回调才会执行.

我们会发现, 单进程的 Javascript 运行时有以下特点:

  • 同步执行的代码一定会在同一个时间段内连续执行
  • 异步执行的代码通过回调方法的方式, 在同步执行的代码结束之后, 才会被执行
  • 运行速度快, CPU利用率高, 给人以并发的错觉
  • 同步执行的代码执行时间过长, 会阻塞其他异步的事件, 导致浏览器页面”卡死”

同样的, 我们的大脑也是单进程, 通常同一个时间内只能同时思考(专注)于一件事情, 合理且高效的利用, 会让我们的工作事半功倍, Javascript 给了我一些启发:

  • 任务可以”同时”执行, 不抗拒同时会有多件任务需要做的局面
  • 同一个时间段内, 只需要专注一个任务
  • 在执行某个任务的期间, 有新的任务分配, 则根据优先级(紧急/重要程度), 进入”执行队列”, 并不打断当前任务
  • 合理高效的用脑
  • 大任务需要拆分为多个小任务, 每个任务都有预期的时间和完成的目标, 减少出现执行一个超大任务, 导致紧急事件需要打断当前任务的情况

上述的原则让我在工作的过程中, 不再恐惧任务的并发, 不再为了频繁的被打断为烦恼, 目标感更加明确了, 更重要的是让我明白, 生活工作中遇到的困难, 有的解决方法就藏在你的身边(心里), 不要让自己陷在自己设下的沼泽里.

最新的:

留下评论