Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该使用process.nextTick还是setImmediate进行异步迭代?_Javascript_Performance_Node.js - Fatal编程技术网

Javascript 我应该使用process.nextTick还是setImmediate进行异步迭代?

Javascript 我应该使用process.nextTick还是setImmediate进行异步迭代?,javascript,performance,node.js,Javascript,Performance,Node.js,我正在研究的是,它提供了可以异步迭代的序列上的map/reduce函数 A建议对于Node.js,我应该使用process.nextTick尽可能快地进行异步迭代。(该库目前在所有环境中都使用setTimeout,我知道这是次优的。)对于节点,我非常缺乏经验,所以我正在阅读该方法的工作原理,我不清楚它是否是一个好的选择 根据,在这种情况下使用setImmediate似乎更有意义,因为nextTick显然会跳到挂起的I/O事件之前,这对我来说很糟糕 这一点似乎得到以下一些评论的证实: 在V0.10

我正在研究的是,它提供了可以异步迭代的序列上的map/reduce函数

A建议对于Node.js,我应该使用
process.nextTick
尽可能快地进行异步迭代。(该库目前在所有环境中都使用
setTimeout
,我知道这是次优的。)对于节点,我非常缺乏经验,所以我正在阅读该方法的工作原理,我不清楚它是否是一个好的选择

根据,在这种情况下使用
setImmediate
似乎更有意义,因为
nextTick
显然会跳到挂起的I/O事件之前,这对我来说很糟糕

这一点似乎得到以下一些评论的证实:

<>在V0.10,NeXTICK/<代码>处理程序在每次调用C++之后运行 转换为JavaScript。这意味着,如果JavaScript代码调用
process.nextTick
,则回调将在代码运行后立即启动 完成,但在返回事件循环之前

那么,我是对的,异步迭代序列应该使用
setImmediate
?或者
nextTick
在这里是更好的选择吗?(无论哪种情况,请清楚解释原因。)

一些注意事项:

我首先要做一些严肃的基准测试,看看setImmediate比
进程慢多少。nextTick
。如果不是(太)慢,我会立即选择
setImmediate
,因为这不会使事件循环陷入饥饿状态

在node 0.10中,对于可以递归调用nextTick的次数有一个硬限制(1000,请参阅),因此您应该防止在任何情况下发生这种情况。您需要在迭代之前选择策略,或者能够在迭代期间更改策略(同时检查当前迭代计数)

如果出于性能原因选择process.nextTick,则可能需要设置一个可配置的硬限制,以限制它在一行中执行
process.nextTick
,否则切换到
setImmediate
。我没有在nodej上处理大量工作的经验,但我确实认为,如果您的库使它们的I/O不稳定,人们不会喜欢它

总的来说,setImmediate肯定是最安全的

至于浏览器: 我没有研究过您的库,但由于您实际上来自
setTimeout
,您可能会通过
window.postMessage
等学习新一代延迟技术。有一个很好的小型库,名为(但语义不同于node next tick!),还有一个,它有点重,因为1)它需要实现setImmediate规范(包括取消计划任务的能力),2)它有更广泛的浏览器兼容性


查看这篇比较setImmediate(shim)和setTimeout的文章。

即使
nextTick
在某种程度上比
setImmediate
快很多,我认为他最好在再次调用
setImmediate
之前执行更多的工作。最后,如果代码执行最终会阻塞所有内容,那么封送代码执行就没有意义了。@HristoDachev:这一点很好。但就他的问题而言,他为什么要“异步迭代”还不清楚。将工作划分为同步执行的批会丢失一些异步性。如果所需要的只是一个用于批处理操作的异步接口,那么一个用于整个工作量的
setImmediate
就足够了,这使得速度差异变得无关紧要。我会问。你到底为什么需要“异步迭代”?假设你有一长串的数据项,需要逐项应用某种昂贵的处理。使用
nextTick
/
setImmediate
将允许其他代码在每个处理步骤之间运行,从而可能保留响应HTTP请求或用户与GUI交互等功能。