Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 变量随时间变化的竞争条件_Javascript_Node.js_Race Condition - Fatal编程技术网

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

Javascript 变量随时间变化的竞争条件,javascript,node.js,race-condition,Javascript,Node.js,Race Condition,我有一个内存中的数组nodejs服务器端,每10秒更新一次,还有一个客户端,每10秒执行一次请求。请求解析数组以获取特定字符串格式的数组。此外,更新过程在setInterval函数中 我想对该端点进行压力测试。我认为,如果将数组解析为字符串的过程移动到更新数组的位置,那么“仅服务”将返回一个类似缓存的字符串,通过压力测试不会有问题 这里,我的问题是:如果更新数组和解析所需的时间太长,直到为缓存的字符串分配新值为止,那么客户端将从服务接收不正确的值,因为它将继续更新。所以我的问题是,如何确保客户始

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

我想对该端点进行压力测试。我认为,如果将数组解析为字符串的过程移动到更新数组的位置,那么“仅服务”将返回一个类似缓存的字符串,通过压力测试不会有问题


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

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

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

客户端向服务器发出请求

服务器开始工作

10秒通行证服务器仍在工作

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

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

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

客户端向服务器发出请求

服务器开始工作

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

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

客户端无限期地向服务器发送另一个请求


您还可以通过新的ish异步函数使您的承诺看起来像您习惯的同步编程

更新数组并将其解析为字符串是一个同步函数,对吗?在这种情况下,没有竞争条件:客户机请求要么在此之前发生并将获得旧结果,要么在更新之后发生并将获得新结果。谢谢。事实上,我现在正在使用async并等待。