变量随时间变化的竞争条件
Race condition with a variable changing in time
我在内存中有一个 array
(nodejs
服务器端),我每 10 秒更新一次,客户端也每 10 秒执行一次请求。该请求解析 array
以获取特定字符串格式。此外,更新过程在 setInterval
函数中。
我想 运行 对该端点进行压力测试。我认为如果我将解析 array
到字符串的过程移动到我正在更新 array
的地方,那么服务只会 return 一个字符串(如缓存)并强调测试通过不会有问题。
在这里,我的问题是:如果更新我的 array
和解析所需的时间太长,直到达到为缓存的字符串分配新值,那么客户端将从该服务,因为它会继续更新。所以我的问题是我怎样才能确定客户总是会收到正确的值。也就是说,在这种情况下如何避免竞争条件。
好消息是;除非你已经产生了一个工人或另一个进程节点是单线程的。所以 Node(在正常情况下)几乎不可能遇到竞争条件。
但是,根据您的描述,您似乎担心您的 http 请求的异步性质。
客户端向服务器发出请求
服务器开始工作
10 秒过去(服务器仍在工作)
由于服务器未完成工作,客户端使用过时的信息向服务器发出另一个请求。
服务器returns旧数据但是,此时为时已晚。
还好,好消息多了。 Javascript 内置了大量对异步编程的支持。通常您会将请求包装在 promise 中以避免此类陷阱。产生如下所示的过程:
客户端向服务器发出请求
服务器开始工作
客户端在继续之前等待服务器返回
服务器完成工作并returns数据到客户端
客户端向服务器发送另一个请求(无限次)
您还可以通过新的(-ish)异步函数使您的 Promises 看起来像您习惯的同步编程。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
我在内存中有一个 array
(nodejs
服务器端),我每 10 秒更新一次,客户端也每 10 秒执行一次请求。该请求解析 array
以获取特定字符串格式。此外,更新过程在 setInterval
函数中。
我想 运行 对该端点进行压力测试。我认为如果我将解析 array
到字符串的过程移动到我正在更新 array
的地方,那么服务只会 return 一个字符串(如缓存)并强调测试通过不会有问题。
在这里,我的问题是:如果更新我的 array
和解析所需的时间太长,直到达到为缓存的字符串分配新值,那么客户端将从该服务,因为它会继续更新。所以我的问题是我怎样才能确定客户总是会收到正确的值。也就是说,在这种情况下如何避免竞争条件。
好消息是;除非你已经产生了一个工人或另一个进程节点是单线程的。所以 Node(在正常情况下)几乎不可能遇到竞争条件。
但是,根据您的描述,您似乎担心您的 http 请求的异步性质。
客户端向服务器发出请求
服务器开始工作
10 秒过去(服务器仍在工作)
由于服务器未完成工作,客户端使用过时的信息向服务器发出另一个请求。
服务器returns旧数据但是,此时为时已晚。
还好,好消息多了。 Javascript 内置了大量对异步编程的支持。通常您会将请求包装在 promise 中以避免此类陷阱。产生如下所示的过程:
客户端向服务器发出请求
服务器开始工作
客户端在继续之前等待服务器返回
服务器完成工作并returns数据到客户端
客户端向服务器发送另一个请求(无限次)
您还可以通过新的(-ish)异步函数使您的 Promises 看起来像您习惯的同步编程。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function