变量随时间变化的竞争条件

Race condition with a variable changing in time

我在内存中有一个 arraynodejs 服务器端),我每 10 秒更新一次,客户端也每 10 秒执行一次请求。该请求解析 array 以获取特定字符串格式。此外,更新过程在 setInterval 函数中。

我想 运行 对该端点进行压力测试。我认为如果我将解析 array 到字符串的过程移动到我正在更新 array 的地方,那么服务只会 return 一个字符串(如缓存)并强调测试通过不会有问题。

在这里,我的问题是:如果更新我的 array 和解析所需的时间太长,直到达到为缓存的字符串分配新值,那么客户端将从该服务,因为它会继续更新。所以我的问题是我怎样才能确定客户总是会收到正确的值。也就是说,在这种情况下如何避免竞争条件。

好消息是;除非你已经产生了一个工人或另一个进程节点是单线程的。所以 Node(在正常情况下)几乎不可能遇到竞争条件。

但是,根据您的描述,您似乎担心您的 http 请求的异步性质。

  1. 客户端向服务器发出请求

  2. 服务器开始工作

  3. 10 秒过去(服务器仍在工作)

  4. 由于服务器未完成工作,客户端使用过时的信息向服务器发出另一个请求。

  5. 服务器returns旧数据但是,此时为时已晚。

还好,好消息多了。 Javascript 内置了大量对异步编程的支持。通常您会将请求包装在 promise 中以避免此类陷阱。产生如下所示的过程:

  1. 客户端向服务器发出请求

  2. 服务器开始工作

  3. 客户端在继续之前等待服务器返回

  4. 服务器完成工作并returns数据到客户端

  5. 客户端向服务器发送另一个请求(无限次)

您还可以通过新的(-ish)异步函数使您的 Promises 看起来像您习惯的同步编程。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function