gpt4 book ai didi

testing - Node 测试。如何避免竞争条件?

转载 作者:行者123 更新时间:2023-11-28 20:12:31 24 4
gpt4 key购买 nike

我目前正在用 nodejs 编写游戏引擎。

我的游戏有几个状态。我们称它们为 StateA、StateB、StateC。序列的流向是StateA => StateB => StateC。

我想在每个状态结束时测试我的引擎状态。我目前有这个结构:

function attachEventListeners = function(instance) {
instance.on('START_STATE_A', stateA);
instance.on('START_STATE_B', stateB);
instance.on('START_STATE_C', stateC);
}

var stateACallBack = function() {};
var stateBCallBack = function() {};
var stateCCallBack = function() {};

function stateA() {
// Do something...
stateACallBack();
setTimeout(function() { this.emit('START_STATE_B'); }, 3000)
}

function stateB() {
// Do something...
stateBCallBack();
setTimeout(function() { this.emit('START_STATE_C'); }, 3000)
}

function stateC() {
// Do something...
stateCCallBack();
setTimeout(function() { this.emit('START_STATE_A'); }, 3000)
}

所以我目前的方法是让我的测试用例覆盖 stateXCallback 并在这些函数中执行测试逻辑。

但是,我看到了一个竞争条件,其中 stateB 在 stateACallBack 完成执行之前被触发。因此,stateACallback 看到的状态应该由 stateBCallback 评估。

我尝试在状态之间注入(inject)延迟时间,但是,这会在我的代码库中引入额外的竞争条件错误。

有人能告诉我解决这个问题的更好方法吗?

最佳答案

很难以如此抽象的方式讨论这个问题,但在我看来,你所说的状态并不是真正的状态,它们是异步事件。这些事件中的每一个都可能改变状态机的内部状态,但这取决于接收事件的顺序。我不确定事件 B 的唯一触发器是否是事件 A,但我假设不是。 (如果是,那么为什么将事件拆分为单独的事件 A、B 和 C?看起来随意且毫无意义,为什么不依次调用每个回调?)。

因此,要实现状态机,您需要在某个地方使用一个变量来跟踪机器所处的当前状态。当接收到事件时,回调必须决定是使用事件并推进状态机,还是将其放入队列中,等待机器处于不同状态。

如果您想要更多详细信息或更准确的答案,您将必须告诉我这些事件是什么以及是什么触发了它们。

关于testing - Node 测试。如何避免竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com