Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi · Oppitunti

GenStatem tilanhallintaan

Hallitsette GenStatemin avulla vankkojen äärellisten tilakoneiden rakentamisen, monimutkaisten tilasiirtymien hallinnan ja tapahtumien tehokkaan käsittelyn.

Oppitunti 1/411 vaihetta

GenStatem tilanhallintaan on ilmainen Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-kurssilla on yhteensä 4 oppituntia.

Tutustuminen GenStatemiin

Tervetuloa GenStatemin pariin! Se on Erlangin OTP-käyttäytymismalli, jolla rakennetaan äärellisiä tilakoneita (FSM). Jos järjestelmäkomponentin on toimittava eri tavoin nykyisen tilansa perusteella, GenStatem on sopiva työkalu.

Ajatelkaa sitä erikoistuneena työkaluna monimutkaisen tilalogiikan hallintaan. Se tarjoaa tilasiirtymien tarkempaan hallintaan enemmän mahdollisuuksia kuin tavallinen GenServer.

FSM:n perusteet

Äärellinen tilakone (FSM) on laskennan matemaattinen malli, joka kuvaa järjestelmän toimintaa. Se voi olla kulloinkin vain yhdessä tilassa.

  • Tilat: Erilliset tilanteet, joissa järjestelmä voi olla (esimerkiksi ”on”, ”off”, ”idle”, ”active”).
  • Tapahtumat: Syötteet tai tapahtumat, jotka käynnistävät tilan muutoksen (esimerkiksi ”button_press”, ”timeout”).
  • Siirtymät: Säännöt, jotka määrittävät, miten tietyssä tilassa tapahtuva tapahtuma siirtää järjestelmän uuteen tilaan.

GenStatem-moduulin perusteet

Kuten muutkin OTP-käyttäytymismallit, GenStatem edellyttää takaisinkutsumoduulia. Tämä moduuli toteuttaa tietyt funktiot, jotka määrittävät FSM:n toiminnan.

Perusfunktio on init/1, joka määrittää FSM:n alkutilan ja alkudatan. Se palauttaa arvon {:ok, InitialState, InitialStateData}.

-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, [], []).

Tilat ja StateData

GenStatemissä tila on yleensä atomi (esimerkiksi :on, :off). StateData on mikä tahansa Erlang-termi, joka sisältää nykyiseen tilaan liittyvät sisäiset tiedot, vastaavasti kuin GenServerin tila.

Siirtymän yhteydessä määritetään sekä uusi tila-atomi että uudet tilatiedot. Näin konteksti ja tiedot voidaan välittää FSM:n eri tilojen välillä.

Tapahtumiin vastaaminen

GenStatem reagoi tapahtumiin takaisinkutsufunktioiden avulla. Asynkronisissa tapahtumissa (kuten gen_statem:cast/2) käytetään handle_event/4-takaisinkutsua.

Funktion allekirjoitus on State(EventType, EventContent, StateData), jossa State on nykyinen tila-atomi ja EventType ilmaisee viestin tyypin (esimerkiksi :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}.

Tilojen vaihtaminen

Tapahtumankäsittelyfunktioiden palautusarvo määrittää FSM:n seuraavan toiminnon. Jos haluatte vaihtaa tilaa, palauttakaa tuple: {:next_state, NewState, NewStateData}.

  • NewState: Seuraavaa tilaa edustava atomi.
  • NewStateData: Päivitetyt tilatiedot, jotka välitetään uuteen tilaan.

Jos haluatte pysyä nykyisessä tilassa, voitte palauttaa arvon {:keep_state, NewStateData} tai arvon {:keep_state_and_data}, jos tiedot eivät muutu.

Synkroniset ja asynkroniset tapahtumat

GenStatem käsittelee erityyppisiä tapahtumia:

  • handle_call/4: Synkronisille kutsuille (gen_statem:call/3). Kutsuja odottaa vastausta.
  • handle_event/4: Asynkronisille cast-kutsuille (gen_statem:cast/2) ja sisäisille viesteille (gen_statem:info/2 tai prosessiviesteille). Kutsuja ei odota.
  • handle_info/4: handle_event-funktion erikoistunut versio prosessiviesteille, jotka eivät ole peräisin funktioista gen_statem:cast tai gen_statem:call. Sitä käytetään usein vähemmän state_functions-tilassa.

Keskitymme esimerkissämme funktioihin handle_call ja handle_event.

Valokytkinesimerkki

Rakennetaan perinteinen FSM: valokytkin! Sillä on kaksi tilaa: off ja on.

Lähetämme sille toggle-tapahtuman tilan vaihtamiseksi. Lisäämme myös tavan tarkistaa sen nykyinen tila.

Valokatkaisimen koodi

Tässä on valokatkaisimen koko Erlang-moduuli. Suorittakaa se ja kokeilkaa sen kanssa vuorovaikutusta!

-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'

GenStatem-haaste

Tarkastellaan GenStatem-moduulia, joka kuvaa ovea, jonka tilat ovat :closed ja :open. Se vastaanottaa tapahtumia :open_door ja :close_door.

Jos ovi on tilassa :closed ja vastaanottaa tapahtuman :open_door, se siirtyy tilaan :open. Jos se on tilassa :open ja vastaanottaa tapahtuman :close_door, se siirtyy tilaan :closed.

Mikä on tilafunktion closed/4 oikea paluuarvo, kun se vastaanottaa tapahtuman :open_door funktion gen_statem:cast/2 kautta?

GenStatem-yhteenveto

Hienoa työtä GenStatemin hallitsemisessa!

Olette oppineet, että GenStatem sopii erinomaisesti äärellisten automaattien (Finite State Machines) toteuttamiseen ja mahdollistaa tilasta riippuvan monimutkaisen logiikan hallinnan. Keskeiset opit:

  • FSM:illä on tiloja, tapahtumia ja siirtymiä.
  • GenStatem käyttää takaisinkutsumoduuleja ja tilafunktioita (esimerkiksi off/4 ja on/4).
  • Tilasta toiseen siirrytään käyttämällä arvoa {:next_state, NewState, NewStateData}.
  • Tapahtumat voivat olla asynkronisia (cast, käsittelijänä handle_event/4) tai synkronisia (call, käsittelijänä handle_call/4).

Tämä tehokas toimintamalli on vankkojen ja ennakoitavien Erlang-järjestelmien rakentamisen kulmakivi.

Aloita maksutta

Opi Erlang tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”GenStatem tilanhallintaan” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolun 3 oppituntia, myös oppitunnin “GenStatem tilanhallintaan”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”GenStatem tilanhallintaan”?

Hallitsette GenStatemin avulla vankkojen äärellisten tilakoneiden rakentamisen, monimutkaisten tilasiirtymien hallinnan ja tapahtumien tehokkaan käsittelyn. Harjoittelet Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”GenStatem tilanhallintaan”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunnilla?

Kyllä. Jokainen Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. GenStatem tilanhallintaan
  2. GenEvent tapahtumien käsittelyyn
  3. Mukautetut OTP-käyttäytymismallit
  4. Hot code swapping ja live upgrade -päivitykset
← Takaisin: Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi