协程和多进程/多线程的区别

多进程/多线程就像是银行窗口,开启多进程/多线程就好比银行多开几个窗口,同时给客户办理业务。但是如果哪个窗口的客户比较磨叽,该窗口的下一个客户只能在后面等(不等同阻塞,阻塞是指线程被挂起)。每个窗口的客户依次排队办理,即为同步。
协程是通过异步实现的,好比医院的B超检查,多线程就是增加接诊窗口,但是对于每一个窗口来说,患者A挂号体检,医生给A做了登记后,让A先去喝水憋尿(耗时操作,例如网络请求),医生不会一直傻等着A憋了尿回来,而是继续接诊患者B。等A回来后,医生诊断完B,再给A做进一步检查,这就是异步。协程是同一个线程内(B超医生)的异步操作。

异步有两种方式:回调和协程。举个例子说明回调。在调用函数A时除了传入必要的参数外,还传入一个参数:函数B。A中有一些费时的操作,比如I/O,A在没得到结果之前就返回,而将等待结果以及进行后续处理的事情交给函数B。这个过程就是回调,函数B就称为回调函数。

这种编程方式不太符合人的思维习惯,代码也不易于理解,情况一复杂,就很可能遇到“回调地狱”:多层嵌套回调。下面是一个JavaScript中使用回调的例子,它嵌套了3层:

1
2
3
4
5
6
7
8
9
api_call1(request1, function (response1){  // 多么痛的领悟
var request2 = step1(response1); // 第一步
api_call2(request2, function (response2){
var request3 = step2(response2); // 第二步
api_call3(request3, function (response3){
step(response3); // 第三步
})
})
})