Skip to content

Instantly share code, notes, and snippets.

@nachivpn
Created May 26, 2017 16:46
Show Gist options
  • Save nachivpn/d4d57affed08708665676a3781bafd83 to your computer and use it in GitHub Desktop.
Save nachivpn/d4d57affed08708665676a3781bafd83 to your computer and use it in GitHub Desktop.
-module(worker_pool).
-compile(export_all).
worker_pool(Funs) ->
Nodes = [node() | nodes()],
Master = self(),
Workers = lists:flatten([initNode(Node,Master,10) || Node <- Nodes]),
Result = master(Funs),
[ receive {get_work,W} -> W ! {no_work,normal} end || W<-Workers],
Result.
initNode(Node,Master,WorkerSize) -> [spawn_worker(Node,Master) || _ <- lists:seq(1,WorkerSize)].
master(Ws) ->
Refs = [
receive
{get_work,Pid} ->
Ref = make_ref(),
Pid ! {new_work,W,Ref} ,
Ref
end
|| W <- Ws
],
[ receive {work_response,Result,Ref} -> Result end || Ref <- Refs ].
worker(Master) ->
Master ! {get_work, self()},
receive
{new_work,W,Ref} -> Master ! {work_response,W(),Ref}, worker(Master);
{no_work,Reason} -> exit(Reason)
end.
spawn_worker(Node,Master) -> spawn_link(Node, fun() -> worker(Master) end).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment