在NodeJs

时间:2016-03-17 19:24:25

标签: node.js concurrency critical-section

我有一个需要运行的操作/任务,这是由一个被触发的事件触发的(我不认为这最后一件事非常重要)。

事实是,这个任务由几个io操作组成,主要是网络调用。此外,我希望以原子方式运行此任务,从头开始结束,一个更新的任务不应该在当前任务完成之前启动。

我通常会使用某种关键部分来做这件事,但我认为在js或节点库lib中没有这样的概念。你怎么建议我应该处理这样的案件?

感谢

编辑:我已经在不同的帖子中多次看到“关键部分不需要,这是单线程”的意见,我认为这只是部分正确,它只适用于同步操作。

假设使用关键部分的典型场景,你需要做两件事情A)检查一个条件的有效性,B)只有当A是真或假时才应用一个动作,这个动作会翻转条件。你不希望2个线程得出A同时为假的结论,并且应该完成B,所以你将A和B包装在一个关键部分以使它们成为原子。在node.js中,如果A同步,那么你很好,没有其他线程会运行,你可以安全地做B。但是如果A是异步的,那么在它的回调触发之前,A的另一个事件可能会出现在事件队列中,然后在第一个事件发生之前它被执行。

1 个答案:

答案 0 :(得分:0)

由于Node本身在单线程环境中运行,因此不需要关键部分。不同类型和风格的控制流程库通常用于此类事物(Async,Bluebird,Q)。

由于mscdex注意到队列会更好,Async有queue()能够处理您描述的场景。保证关键部分'感觉只是为队列设置了concurrency: 1

相关问题