Skip to content

Instantly share code, notes, and snippets.

@rogeralsing
Created April 14, 2017 14:36
Show Gist options
  • Save rogeralsing/c98032c6149adeedbab025d279b8c962 to your computer and use it in GitHub Desktop.
Save rogeralsing/c98032c6149adeedbab025d279b8c962 to your computer and use it in GitHub Desktop.
-module(router).
-author("ROJO01").
-export([start/2]).
start(N, F) ->
Workers = spawn_workers(N, [], F),
spawn(fun() -> round_robin_router(Workers, 0) end).
round_robin_router(Workers, Next) ->
receive
stop ->
stop_workers(Workers);
Any ->
forward_message(Next, Workers, Any),
round_robin_router(Workers, Next + 1)
end.
stop_workers(Workers) ->
io:format("Stopping workers~n"),
lists:foreach(fun(Pid) -> exit(Pid, ok) end, Workers),
ok.
forward_message(Next, Workers, Any) ->
Capped = Next rem length(Workers) + 1,
Pid = lists:nth(Capped, Workers),
Pid ! Any.
spawn_workers(0, Workers, _) ->
Workers;
spawn_workers(N, Workers, F) ->
Worker = spawn(F),
spawn_workers(N - 1, Workers ++ [Worker], F).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment