nodejs和go均擅长做web服务器
nodejs | go | |
---|---|---|
内存限制 | 64 位操作系统约为 1.4G 32 位操作系统约为 0.7G |
nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine。关于协程的话题,简单来说,可以看作是非抢占式的轻量级线程。
nodejs await协程
function sleep(ms){
return new Promise((resolve,reject) => setTimeout(
()=>resolve(),ms
))
}
async function hello(){
await sleep(3000)
console.log("hello")
};
async function test(){
await sleep(3000)
console.log("world")
};
hello();
test();
go协程
package main
import (
"fmt"
"time"
)
func deferPrint(str string){
time.Sleep(time.Second*2)
fmt.Println(str)
}
func main(){
go deferPrint("hello")
go deferPrint("world")
//如果主协程不阻塞,永远不会切换
time.Sleep(time.Second*4)
}
golang之所以要支持锁协程,我想是为了多线程支持。golang中可以启用多个线程并行执行相同数量的协程。
nodejs受限于v8的isolate机制,只能跑在单线程中。所有代码无法并行执行,无法处理计算密集型应用场景。
nodejs使用await阻塞协程,手动切换线程控制权,node的协程是c++控制的,c++里写了这个函数可以被推入事件队列就能够用promise封装成协程
golang在协程阻塞时自动切换协程,所以在写golang的时候所有的代码可以都写同步代码,然后用go关键字去调用,golang的协程是自己规定的,所有函数在阻塞时都必须切换线程控制权
- nodejs中async函数是能直接返回值的
- golang只能传递一个引用的channel
golang类似与小c++,最大的亮点就是使用协程管理多线程。