Skip to main content

有限状态机 FSM

· 3 min read
YozMuS

生活中的例子

在日常的很多装置中看到状态机这种行为。例如,自动售卖机,只有投入合适的硬币,售卖机才会吐出相应的产品;密码箱,只有输入正确的密码序列,密码箱才会变为开启状态;门禁闸机,只有被闸机接受的刷卡行为,闸机才会将关闭状态变为开启状态:

l8Jjn3

电风扇按下按钮,才能在关、弱档、中档和强档几个状态中转移:

KfCdc7

代码实现

xstate 实现 FSM 的典型代码

const machine = createMachine({
id: 'light',
initial: 'green',
states: {
green: { on: { TIMER: 'yellow' } },
yellow: { on: { TIMER: 'red' } },
red: { on: { TIMER: 'green' } },
},
});

// 使用状态机服务
const service = interpret(machine)
.onTransition(state => console.log(state.value))
.start();

Redux 实现 FSM 的典型代码

// Reducer中手动管理状态转移
const initialState = { status: 'green' };

function trafficLight(state = initialState, action) {
switch (action.type) {
case 'TIMER':
if (state.status === 'green') return { status: 'yellow' };
if (state.status === 'yellow') return { status: 'red' };
if (state.status === 'red') return { status: 'green' };
return state;
default:
return state;
}
}

// 需要手动触发 action
store.dispatch({ type: 'TIMER' });

Python transitions 实现 FSM 的典型代码

from transitions import Machine

class TrafficLight:
def __init__(self):
# 定义状态和转移规则
self.machine = Machine(
model=self,
states=['green', 'yellow', 'red'],
initial='green',
transitions=[
{'trigger': 'timer', 'source': 'green', 'dest': 'yellow'},
{'trigger': 'timer', 'source': 'yellow', 'dest': 'red'},
{'trigger': 'timer', 'source': 'red', 'dest': 'green'}
]
)
# 添加状态变更监听
self.machine.on_enter_state(self._on_state_change)

def _on_state_change(self):
print(f"当前状态: {self.state}")

# 使用示例
if __name__ == "__main__":
light = TrafficLight() # 初始状态会自动触发打印 "当前状态: green"

# 模拟事件触发
light.timer() # green → yellow
light.timer() # yellow → red
light.timer() # red → green

References

  1. 什么是状态机(Finite-state machine)?
  2. 什么是状态机?一篇文章就够了