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