%%% Erlang-Demonstrationsprogramm %%% Vorlesung "Parallelität in funktionalen Sprachen %%% Sommersemester 2006 -module(demo). -export([start/0, say/2, pingpong/0, ping/2, pong/0, pingpong1/0, ping1/1, startping/1, startpong/0, ping2/2, pingpong2/1]). %%% Starten zweier Prozesse say(_, 0) -> done; say(What, Times) -> io:format("~p~n", [What]), say(What, Times-1). start() -> spawn(demo, say, [hello, 3]), spawn(demo, say, [goodbye, 3]). %%% Ping-Pong-Prozesse pingpong() -> Pong_PID = spawn(demo, pong, []), spawn(demo, ping, [3, Pong_PID]). ping(0, Pong_PID) -> Pong_PID ! finished, io:format("Ping finished~n", []); ping(N, Pong_PID) -> Pong_PID ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping(N - 1, Pong_PID). pong() -> receive finished -> io:format("Pong finished~n", []); {ping, Ping_PID} -> io:format("Pong received ping~n", []), Ping_PID ! pong, pong() end. %%% PingPong mit registriertem Prozess Pong pingpong1() -> register(pong, spawn(demo, pong, [])), spawn(demo, ping1, [3]). ping1(0) -> pong ! finished, io:format("ping finished~n", []); ping1(N) -> pong ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping1(N - 1). %%% PingPong auf separaten Erlangknoten ping2(0, Pong_Node) -> {pong, Pong_Node} ! finished, io:format("ping finished~n", []); ping2(N, Pong_Node) -> {pong, Pong_Node} ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping2(N - 1, Pong_Node). %%% zum Start auf verschiedenen Knoten startpong() -> register(pong, spawn(demo, pong, [])). startping(Pong_Node) -> spawn(demo, ping2, [3, Pong_Node]). %%% Start auf einem Knoten %%% Aufruf mit demo:pingpong2(erlnode@zinder) %%% unter der Voraussetzung, dass auf zinder %%% ein Erlangknoten mit Namen erlnode gestartet wurde %%% erl -sname erlnode pingpong2(Ping_Node) -> register(pong, spawn(demo, pong, [])), spawn(Ping_Node, demo, ping2, [3, node()]).