【问题标题】:Race condition with a variable changing in time变量随时间变化的竞争条件
【发布时间】:2023-03-23 01:49:01
【问题描述】:

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

我想对该端点进行压力测试。我认为如果我将解析array 到字符串的过程移动到我正在更新array 的位置,那么服务只会返回一个字符串(如缓存)并且压力测试不会成为问题通过.

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

【问题讨论】:

  • 更新array 并将其“解析”为字符串是一个同步函数,对吧?在这种情况下,不存在竞争条件:客户端请求要么在此之前发生(并将获得旧结果),要么在更新之后发生(并将获得新结果)。

标签: javascript node.js race-condition


【解决方案1】:

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

但是,从您的描述来看,您似乎担心 http 请求的异步性质。

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

  2. 服务器开始工作

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

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

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

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

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

  2. 服务器开始工作

  3. 客户端等待服务器返回后再继续

  4. 服务器完成工作并向客户端返回数据

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

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

【讨论】:

  • 谢谢。事实上,我现在正在使用 async 和 await。
猜你喜欢
  • 2012-04-29
  • 2019-03-21
  • 2019-03-03
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多