Nodejs 也是属于javascript,只是之前javascript只能应用在浏览器端,用户想要做一些服务端的事是一件比较难的事,这个时候node就应运而生。前端的小伙伴们也很兴奋,终于可以独立的完成一个项目,不用天天催着接口开发了。嗯...是的,它做到了,未来也会做的更多。
nodejs是什么
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。它是单线程的设计模式,为什么说是单线程呢?比如如果设计成多线程,说明同一个时间执行多个任务,如果说这些任务是冲突的,那么这个处理也会带来更多的麻烦,比如用户想要添加一个dom节点同时又要删除这个dom节点,这个时候就不知道怎么处理了。因此,为了简化设计,单线程也带来了高效的处理模式。
既然是单线程,为什么说nodejs可以做好多任务呢?这些任务是怎么执行呢?其实nodejs的单线程是基于它提供给用户使用的主线程只有一个,而其他任务都是工作在线程池中的,说它是单线程并不是说它没有并发的能力,只是从设计模式上来讲 这个确实是单线程。
工作原理
用户每触发一个任务 都会放到线程池Event Loop中去,然后再把具体的任务给到操作系统,然后让操作系统去执行,执行之后再把回调给到Event Loop,最后再给到用户。线程池中也有调度器,负责调度任务的优先级,比如setTimeout和FS.readfile这两个任务,对于用户而言,他希望更快的能拿到延迟给的结果,而读取文件这个看起来是不确定的操作,所以在设计任务优先级的时候,也从用户的角度出发,看哪个对于用户而言是最要先拿到反馈的。
它可以做什么
nodejs主要功能是处理I/O密集型的任务,而且它的处理效率也非常高。所谓I/O密集型,包括文件I/O、网络I/O等等。之所以效率高,也是因为它的设计模式,基于event loop,可以实现IO多路复用,每个I/O都是一个线程,而且它们共属于同一个进程,这样,操作系统分配给进程的空间,这些线程可以共享,无需分配多余空间,所以省空间,自然也提高了开发效率。我们知道IO读取是一个不确定的状态,我们利用异步转同步的技术,可以使代码更容易理解,没有一堆的callback,造成代码上的难维护。异步转同步并不会阻塞队列的执行,而是将任务放到队列中去,如果这个时候有其他任务,也同样放到队列中去,并发执行,所谓非阻塞,就是不需要等待上一个程序执行完毕再执行下一个程序,比如有两个读取文件的操作,如果是阻塞型的,就是必须等待第一个任务执行完并且返回结果才会执行第二个任务,非阻塞,就是相反,这个也提高了工作效率。
总得来看,nodejs是一个非常适合用于异步I/O操作的非阻塞型的任务。如有不对,欢迎指出。