代码之家  ›  专栏  ›  技术社区  ›  Pavel Angel Mendoza Villafane

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

  •  0
  • Pavel Angel Mendoza Villafane  · 技术社区  · 7 年前

    我有一个 array 内存中( nodejs 服务器端),我每10秒更新一次,还有一个客户端也每10秒进行一次请求。请求解析 大堆 以特定的字符串格式获取。此外,更新过程处于 setInterval 作用

    我想对该端点进行压力测试。我想如果我移动解析 大堆 字符串到我正在更新 大堆 ,则仅服务将返回一个字符串(如缓存),压力测试将不会是一个问题。

    这里,我的问题是:如果需要时间更新我的 大堆 而解析需要很长时间,直到为缓存的字符串分配一个新值,然后客户端将从服务接收到一个不正确的值,因为它将继续更新。所以我的问题是,我如何才能确保客户始终收到正确的值。也就是说,在这种情况下,我如何避免种族状况。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Michael Sorensen    7 年前

    好消息是;除非生成了一个工作进程或另一个进程节点是单线程的。因此,节点(在正常情况下)不可能遇到竞争条件。

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

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

    2. 服务器开始工作

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

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

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

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

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

    2. 服务器开始工作

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

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

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

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