-module(ping_test).
-compile(export_all).

ping() ->
% создаем процесс pong, связанный с текущим
    Pid = spawn_link(fun pong/0),
    Pid ! {ping, self()},
    ping_loop(Pid).

% обработка сообщений от процесса pong
ping_loop(Pid) ->
    receive
        {pong, Pid} ->
            io:format("received pong~n"),
            timer:sleep(random:uniform(1200)),
            Pid ! {ping, self()},
            ping_loop(Pid) % ждем...
        after 1000 ->
            io:format("pong timed out~n"),
            erlang:error(pong_timeout)
    end.

% входная точка процесса pong
pong() ->
    receive
        {ping, Pid} ->
            io:format("received ping~n"),
            timer:sleep(random:uniform(1200)),
            Pid ! {pong, self()},
            pong() % цикл
    after 1000 ->
        io:format("ping timed out~n"),
        erlang:error(ping_timeout)
    end.