在 NodeJs 中实现关键部分的正确方法
Correct way to implement a critical section in NodeJs
我有一个 operation/task 我需要 运行,它是由一个事件触发的(我认为最后这件事并不重要)。
事实是,这个任务由几个io操作组成,主要是网络调用。另外,我想运行这个任务原子地,开始到结束,一次一个,新的任务不应该在当前任务完成之前开始。
我通常会使用某种关键部分来执行此操作,但我认为 js 或节点库中没有这样的概念。你建议我应该如何处理这样的情况?
谢谢
编辑:我在不同的帖子中多次看到 "critical sections are not needed, this is single threaded" 意见,我认为这只是部分正确,它只适用于同步操作。
假设使用关键部分的典型场景,您需要做两件事 A) 检查条件的有效性,B) 仅当 A 为真或假时才应用操作,该操作将翻转条件。您不希望 2 个线程同时得出 A 为假的结论,并且 B 应该完成,因此您将 A 和 B 包装在临界区中以使它们成为原子。在 node.js 中,如果 A 处于同步状态,那么你没问题,没有其他线程会 运行ning,你可以安全地执行 B。但是如果 A 是异步的,在它的回调触发之前,A 的另一个事件可能会出现在事件队列中,在第一个事件被 B 执行之前。
我有一个 operation/task 我需要 运行,它是由一个事件触发的(我认为最后这件事并不重要)。
事实是,这个任务由几个io操作组成,主要是网络调用。另外,我想运行这个任务原子地,开始到结束,一次一个,新的任务不应该在当前任务完成之前开始。
我通常会使用某种关键部分来执行此操作,但我认为 js 或节点库中没有这样的概念。你建议我应该如何处理这样的情况?
谢谢
编辑:我在不同的帖子中多次看到 "critical sections are not needed, this is single threaded" 意见,我认为这只是部分正确,它只适用于同步操作。
假设使用关键部分的典型场景,您需要做两件事 A) 检查条件的有效性,B) 仅当 A 为真或假时才应用操作,该操作将翻转条件。您不希望 2 个线程同时得出 A 为假的结论,并且 B 应该完成,因此您将 A 和 B 包装在临界区中以使它们成为原子。在 node.js 中,如果 A 处于同步状态,那么你没问题,没有其他线程会 运行ning,你可以安全地执行 B。但是如果 A 是异步的,在它的回调触发之前,A 的另一个事件可能会出现在事件队列中,在第一个事件被 B 执行之前。