{mymodule, ok, Ref}, loop(State2); upgrade -> mymodule:loop(State); M -> io:format("Niezrozumiala wiadomosc: ~p~n", [M]), loop(State) after 1000 -> io:format("Nic sie nie dzieje~n"), loop(State) end.
% Kod wykonywany po stronie klienta
new_state(Pid, X) -> Ref = make_ref(), % stworzy unikalna wartosc, aby nie pomylic sie przy odbiorze Pid ! {mymodule, new_state, self(), Ref, X}, % wyslij wiadomosc rec1(Ref). % zacznij odbierac, potencjalnie usuwajac stare (po timeoutach) wiadomosci
rec1(Ref) -> receive {mymodule, ok, Ref, OldState} -> ok % czekaj na dokladnie nasza wiadomosc, jesli jej nie ma, to: {mymodule, ok, OtherRef, _OldState} -> rec1(Ref); % usun stare wiadomosci z kolejki i czekaj nadal na odbior, jesli ich nie ma, to: after 1000 -> throw (timeout) % w przypadku timeoutu, zglos wyjatek end.
... (make_ref/0 zwraca unikalną wartość, dzięki czemu nawet przy przekroczeniu czasu oczekiwania i przyjściu starej wiadomości selektywny receive nie pomyli nowej odpowiedzi ze starą)
W większości wypadków korzysta się z wytycznych projektowych OTP, wśród których istnieje zachowanie (behaviour) gen_server, ułatwiające pisanie wydajnych i bezpiecznych serwerów.