对于节点,您可以针对这种类型的场景进行非常简单的优化,那就是创建一个工作池。由于 v8 引擎的工作方式,以及节点如何使用事件循环等……单个节点进程实际上只能希望使用处理器内核的 50% 左右。假设一个相对标准的事件循环(不是大量的同步工作要做),您的描述似乎是典型的文件服务器(大量 I/O,但很少有处理器繁重的操作),您可以通过启动获得显着的性能提升许多节点工作者。这可以最大限度地减少您的一个节点进程未侦听事件的时间,并最大限度地提高 CPU 的工作量。这当然不会加速单个交易,
https://github.com/isaacs/cluster-master
Cluster-master 是一个方便的工具,用于管理工作人员,并保持创建工作人员池的过程稳定和简单,我相信可以与 NPM 一起安装。
编辑:
什么可以运行异步,什么必须运行同步并不总是很容易分辨。需要注意的一些经验法则:
名称中带有同步的节点/库调用...
大型函数,很少调用其他函数。
忙 while 循环
一些替代方案:
如果您有一个无法避免的繁忙 while 循环。你可以做一些很酷的逻辑,至少让你的事件循环时间抓住新的事件。这可能不是很有效的代码(不是在带有节点的 pc 上),但它应该演示这个概念:
var someInt;
function callBack() {
doWorkWith(someInt);
someInt++;
if(someInt < someMaximum) event.trigger(whileLoop);//The entire event loop will be able to run before we get to the next iteration of callback because we're using events!
}
event.register(whileLoop, callBack);
我不记得在节点中注册事件的代码,但是当你需要 while 循环时,这个逻辑很有用,因为它允许你的整个事件循环在每次迭代时运行,其中:
while(someInt++ < someMax) {
doWorkWith(someInt);
}
当 while 循环运行时,不会让任何其他事件被拾取。
需要注意的另一件事是库程序员的不良做法,尤其是 I/O 库。除非您有机会查看代码,或者对某个库有非常积极的评价,否则请假设您所做的任何库调用都更糟,并调查它们是否是问题的根源。