这是来自深入浅出NodeJS一书的
为什么说异步耗时取决于最慢的文件就算是异步,不也是单线程,需要一个任务执行完再执行下一个么取决于最慢的文件不就是说这两个代码是同时执行的?
同步I/O 是 1->2->3->4 这样的时间,为1+2+3+4的时间
异步I/O 是 --> 1 2 3 4 四个同时开始 时间为4个里面最慢的那个。。
还有js单线程只是你写的那些基本的js代码为单线程,一但是基本的网络或者文件I/O,的时候会进入事件循环,进行并发操作。。。1234 是同时开始的。谁也不等谁。
同时进行的,互不干扰。
node.js异步任务底层是多线程实现的,对于一个异步任务,node维护一个线程池,一个异步任务从线程池中取出一个线程去执行,执行完后,将线程放回线程池
同时进行和同步是两回事情!同步是指按事情执行的前后顺序!后者必须依赖前者的结果!异步是同时进行但是事情之间的联系对于整个流程来说影响不大!好比同时进行多个ajax 请求你的目的只是为了请求数据后展示数据之间并没有任何关联。打个比方吧!就好比修路!肯定是先铺沥青再去划线!不然你边铺路边画线就把铺好的路给搞砸了!这时必须同步异步就会一团糟!但是划线和道路清理和道路围栏的安装这些事情可以同时进行就是所谓的异步并不会影响结果但是也会出现快慢因为安装围栏的复杂度高相比其他操作的慢但是最后还是完成了整个流程!反过来看如果你把后三者都按同步处理等待时间就会更加长因为都要等着前一步处理掉再去处理后一步!但是之前10个人修路由于后期要处理三件事情要想实现异步必须增加到30人就好比我们增加了计算机的开销一样(不太专业这里),但是往往计算资源过剩我们这样异步就很好利用了计算资源!
一个程序,同一时刻,能利用CPU多核并行执行多个任务,底层不是多线程就是多进程.
Node的底层是libuv.
对于网络读写(I/O),libuv在Linux上用的是内核提供的epoll机制.Linux内核epoll的底层应该是使用内核线程实现的,不过epoll的底层实现不需要libuv关心,libuv只需调用.
对于文件读写(I/O),libuv可能使用Linux AIO,也可能自己用多线程实现.因为Linux内核提供的异步文件读写机制AIO主要还是为数据库服务的,比如MySQL就依赖libaio.so.目前的Kernel AIO仅支持O_DIRECT方式(DirectIO)来对磁盘读写.这意味着,程序无法利用系统的缓存Page Cache,同时它要求读写的的大小和偏移要以区块的方式对齐.对于大文件读写可能还好,小文件不太适合.所以libuv应该是自己在底层用多线程来实现异步文件读写.
不管是网络读写还是文件读写,程序总是要返回的,什么时候返回,肯定是所有任务处理完成后返回,所以耗时一般是读写时间最长的那个任务.不过,文件读写可能受限于磁盘IOPS,不可避免会产生阻塞,这时整体耗时可能会更长.
Node用于服务器编程或者服务器中间层编程时,主要还是发生网络读写.
还有js单线程只是你写的那些基本的js代码为单线程,一但是基本的网络或者文件I/O,的时候会进入事件循环,进行并发操作。。。1234 是同时开始的。谁也不等谁。
同时进行的,互不干扰。
node.js异步任务底层是多线程实现的,对于一个异步任务,node维护一个线程池,一个异步任务从线程池中取出一个线程去执行,执行完后,将线程放回线程池
同时进行和同步是两回事情!同步是指按事情执行的前后顺序!后者必须依赖前者的结果!异步是同时进行但是事情之间的联系对于整个流程来说影响不大!好比同时进行多个ajax 请求你的目的只是为了请求数据后展示数据之间并没有任何关联。打个比方吧!就好比修路!肯定是先铺沥青再去划线!不然你边铺路边画线就把铺好的路给搞砸了!这时必须同步异步就会一团糟!但是划线和道路清理和道路围栏的安装这些事情可以同时进行就是所谓的异步并不会影响结果但是也会出现快慢因为安装围栏的复杂度高相比其他操作的慢但是最后还是完成了整个流程!反过来看如果你把后三者都按同步处理等待时间就会更加长因为都要等着前一步处理掉再去处理后一步!但是之前10个人修路由于后期要处理三件事情要想实现异步必须增加到30人就好比我们增加了计算机的开销一样(不太专业这里),但是往往计算资源过剩我们这样异步就很好利用了计算资源!
一个程序,同一时刻,能利用CPU多核并行执行多个任务,底层不是多线程就是多进程.
Node的底层是libuv.
对于网络读写(I/O),libuv在Linux上用的是内核提供的epoll机制.Linux内核epoll的底层应该是使用内核线程实现的,不过epoll的底层实现不需要libuv关心,libuv只需调用.
对于文件读写(I/O),libuv可能使用Linux AIO,也可能自己用多线程实现.因为Linux内核提供的异步文件读写机制AIO主要还是为数据库服务的,比如MySQL就依赖libaio.so.目前的Kernel AIO仅支持O_DIRECT方式(DirectIO)来对磁盘读写.这意味着,程序无法利用系统的缓存Page Cache,同时它要求读写的的大小和偏移要以区块的方式对齐.对于大文件读写可能还好,小文件不太适合.所以libuv应该是自己在底层用多线程来实现异步文件读写.
不管是网络读写还是文件读写,程序总是要返回的,什么时候返回,肯定是所有任务处理完成后返回,所以耗时一般是读写时间最长的那个任务.不过,文件读写可能受限于磁盘IOPS,不可避免会产生阻塞,这时整体耗时可能会更长.
Node用于服务器编程或者服务器中间层编程时,主要还是发生网络读写.