【问题标题】:Correct way to implement a critical section in NodeJs在 NodeJs 中实现关键部分的正确方法
【发布时间】:2016-03-17 19:24:24
【问题描述】:

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

问题是,这个任务由几个io操作组成,主要是网络调用。另外,我想原子地运行这个任务,从头到尾,一次一个,新的任务不应该在当前任务完成之前开始。

我通常会使用某种关键部分来执行此操作,但我认为 js 或节点库库中没有这样的概念。你建议我应该如何处理这样的案件?

谢谢

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

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

【问题讨论】:

  • 为什么不简单地使用队列?

标签: node.js concurrency critical-section


【解决方案1】:

正如mscdex 指出的那样,队列更可取,Async 有queue() 能够处理您描述的场景。为了保证“临界区”的感觉,只需为队列设置concurrency: 1

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2019-04-08
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多