比赛条件随时间变化

时间:2019-05-06 20:12:17

标签: javascript node.js race-condition

我的内存(array服务器端)中有一个nodejs,我每10秒钟更新一次,还有一个客户端每10秒钟进行一次请求。该请求解析array以获取特定的字符串格式。另外,更新过程是在setInterval函数中进行的。

我想对该端点进行压力测试。我以为如果将解析array到字符串的过程移到我要更新array的地方,那么仅服务将返回一个字符串(如缓存),而压力测试将不会要解决的问题。

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

1 个答案:

答案 0 :(得分:1)

好消息是;除非您已生成工作线程或其他进程,否则节点是单线程的。因此,在正常情况下,Node几乎不可能遇到竞争条件。

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

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

  2. 服务器开始工作

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

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

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

幸运的是,还有更多的好消息。 Javascript具有对异步编程的内置支持。通常,您会将请求包装在promise中,以避免此类陷阱。结果是这样的过程:

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

  2. 服务器开始工作

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

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

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

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