GenStatem voor statebeheer
Beheers GenStatem om robuuste finite-state machines te bouwen, complexe statetransities te beheren en events effectief af te handelen.
GenStatem voor statebeheer is een gratis Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen bevat in totaal 4 lessen.
Maak kennis met GenStatem
Welkom bij GenStatem! Dit is een OTP-behaviour in Erlang waarmee u eindige toestandsmachines (FSM's) bouwt. Als een onderdeel van uw systeem zich afhankelijk van zijn huidige toestand anders moet gedragen, is GenStatem een goede keuze.
U kunt het zien als een gespecialiseerd hulpmiddel voor het beheren van complexe toestandslogica, met explicietere controle over toestandsovergangen dan een gewone GenServer.
De basis van FSM's
Een eindige toestandsmachine (FSM) is een wiskundig rekenmodel dat het gedrag van een systeem beschrijft. Het systeem kan op elk moment slechts in één toestand zijn.
- Toestanden: Afzonderlijke situaties waarin een systeem zich kan bevinden (bijvoorbeeld "aan", "uit", "inactief", "actief").
- Gebeurtenissen: Invoer of gebeurtenissen die een toestandswijziging veroorzaken (bijvoorbeeld "button_press", "timeout").
- Overgangen: Regels die bepalen hoe een gebeurtenis in een bepaalde toestand leidt tot een nieuwe toestand.
Basis van GenStatem-modules
Net als andere OTP-behaviours vereist GenStatem een callbackmodule. Deze module implementeert specifieke functies die het gedrag van de FSM bepalen.
De eenvoudigste functie is init/1, die de initiële toestand en gegevens voor uw FSM instelt. Deze geeft {:ok, InitialState, InitialStateData} terug.
-module(my_fsm).
-behaviour(gen_statem).
-export([start_link/0]).
-export([init/1]).
-export([callback_mode/0]).
% Minimal init for a GenStatem
init(_Args) ->
io:format("FSM initializing...~n"),
InitialState = off, % Our first state
InitialStateData = [], % Any data we want to carry
{:ok, InitialState, InitialStateData}.
% Defines how events are handled (state-name based)
callback_mode() ->
state_functions.
start_link() ->
gen_statem:start_link({local, ?MODULE}, ?MODULE, [], []).Toestanden en StateData
In GenStatem is een toestand meestal een atom (bijvoorbeeld :on, :off). StateData is elke Erlang-term die de interne informatie bevat die bij de huidige toestand hoort, vergelijkbaar met de toestand van een GenServer.
Wanneer u een overgang uitvoert, geeft u zowel het nieuwe toestandsatom als de nieuwe toestandsgegevens op. Zo kunt u context en informatie tussen verschillende toestanden van uw FSM meenemen.
Reageren op gebeurtenissen
GenStatem gebruikt callbackfuncties om op gebeurtenissen te reageren. Voor asynchrone gebeurtenissen (zoals gen_statem:cast/2) wordt de callback handle_event/4 gebruikt.
De functiesignatuur is State(EventType, EventContent, StateData), waarbij State de huidige toestandsatom is en EventType het type bericht aangeeft (bijvoorbeeld :cast, :info).
% Example for 'off' state
off(cast, toggle, StateData) ->
io:format("Switching to ON from OFF~n"),
{:next_state, on, StateData}; % Transition to 'on' state
off(info, _Msg, StateData) ->
io:format("Received info in OFF state~n"),
{:next_state, off, StateData}.Van toestand veranderen
De retourwaarde van uw functies voor gebeurtenisafhandeling bepaalt de volgende actie van de FSM. Om van toestand te veranderen, geeft u een tuple terug: {:next_state, NewState, NewStateData}.
NewState: De atom die de volgende toestand vertegenwoordigt.NewStateData: De bijgewerkte toestandsgegevens die naar de nieuwe toestand worden meegenomen.
Als u in de huidige toestand wilt blijven, kunt u {:keep_state, NewStateData} teruggeven, of {:keep_state_and_data} als de gegevens niet veranderen.
Synchrone versus asynchrone gebeurtenissen
GenStatem verwerkt verschillende typen gebeurtenissen:
handle_call/4: Voor synchrone aanroepen (gen_statem:call/3). De aanroeper wacht op een antwoord.handle_event/4: Voor asynchrone casts (gen_statem:cast/2) en interne berichten (gen_statem:info/2of procesberichten). De aanroeper wacht niet.handle_info/4: Een gespecialiseerde variant vanhandle_eventvoor procesberichten die niet afkomstig zijn vangen_statem:castofgen_statem:call. Deze wordt minder vaak gebruikt met de modusstate_functions.
In ons voorbeeld richten we ons op handle_call en handle_event.
Voorbeeld van een lichtschakelaar
We bouwen een klassieke FSM: een lichtschakelaar! Deze heeft twee toestanden: off en on.
We sturen een gebeurtenis toggle om de toestand te wijzigen. Ook voegen we een manier toe om de huidige status te controleren.
Code voor de lichtschakelaar
Hier is de volledige Erlang-module voor onze lichtschakelaar. Voer de module uit en probeer ermee te werken!
-module(light_switch).
-behaviour(gen_statem).
-export([start_link/0, toggle/0, status/0]).
-export([init/1, callback_mode/0]).
-export([off/4, on/4]). % Export state functions
% -- Public API --
start_link() ->
gen_statem:start_link({local, ?MODULE}, ?MODULE, [], []).
toggle() ->
gen_statem:cast(?MODULE, toggle).
status() ->
gen_statem:call(?MODULE, status).
% -- GenStatem Callbacks --
init(_Args) ->
io:format("Light switch initializing to OFF~n"),
{:ok, off, []}. % Initial state 'off', no specific data
callback_mode() ->
state_functions.
% -- State 'off' callbacks --
off(cast, toggle, StateData) ->
io:format("Switching from OFF to ON~n"),
{:next_state, on, StateData};
off(call, status, From, StateData) ->
gen_statem:reply(From, off),
{:keep_state, StateData};
off(EventType, EventContent, StateData) ->
io:format("OFF state received unhandled event: ~p, ~p~n", [EventType, EventContent]),
{:keep_state, StateData}.
% -- State 'on' callbacks --
on(cast, toggle, StateData) ->
io:format("Switching from ON to OFF~n"),
{:next_state, off, StateData};
on(call, status, From, StateData) ->
gen_statem:reply(From, on),
{:keep_state, StateData};
on(EventType, EventContent, StateData) ->
io:format("ON state received unhandled event: ~p, ~p~n", [EventType, EventContent]),
{:keep_state, StateData}.
% --- How to run this code in Erlang shell: ---
% c(light_switch).
% light_switch:start_link().
% light_switch:status(). % Should be 'off'
% light_switch:toggle().
% light_switch:status(). % Should be 'on'
% light_switch:toggle().
% light_switch:status(). % Should be 'off'
Uitdaging met GenStatem
Stel je een GenStatem-module voor die een deur met de toestanden :closed en :open voorstelt. De module ontvangt de gebeurtenissen :open_door en :close_door.
Als de deur :closed is en :open_door ontvangt, gaat de deur over naar :open. Als de deur :open is en :close_door ontvangt, gaat de deur over naar :closed.
Wat is de juiste retourwaarde van de toestandsfunctie closed/4 wanneer deze via gen_statem:cast/2 een gebeurtenis :open_door ontvangt?
Samenvatting van GenStatem
Goed gedaan met het onder de knie krijgen van GenStatem!
Je hebt geleerd dat GenStatem ideaal is voor het implementeren van eindige-toestandsmachines, waarmee je complexe logica die afhankelijk is van toestanden kunt beheren. De belangrijkste punten:
- FSM's hebben toestanden, gebeurtenissen en overgangen.
- GenStatem gebruikt callbackmodules en toestandsfuncties (bijvoorbeeld
off/4enon/4). - Je gaat over van de ene toestand naar de andere met
{:next_state, NewState, NewStateData}. - Gebeurtenissen kunnen asynchroon zijn (
cast, afgehandeld doorhandle_event/4) of synchroon (call, afgehandeld doorhandle_call/4).
Dit krachtige gedrag vormt een hoeksteen voor het bouwen van robuuste, voorspelbare systemen in Erlang.
Leer Erlang met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “GenStatem voor statebeheer” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen, waaronder “GenStatem voor statebeheer”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen bevat in totaal 4 lessen.
Wat leer ik in “GenStatem voor statebeheer”?
Beheers GenStatem om robuuste finite-state machines te bouwen, complexe statetransities te beheren en events effectief af te handelen. Je oefent met Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen te beginnen?
Ervaring vooraf is niet nodig. Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “GenStatem voor statebeheer”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen?
Ja. Elke les over Erlang OTP: programmeren van gedistribueerde en fouttolerante systemen bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- GenStatem voor statebeheer
- GenEvent voor eventafhandeling
- Aangepaste OTP-behaviors
- Hot code swapping en live upgrades