ebb_worker.erl 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. -module(ebb_worker).
  2. -export([start_link/3, start_link/4, stop/1]).
  3. -export([worker/3, worker/4]).
  4. start_link(Func, Args, Receiver) ->
  5. try
  6. spawn_link(?MODULE, worker, [Func, Args, Receiver])
  7. of
  8. Pid -> {ok, Pid}
  9. catch
  10. Error -> Error
  11. end.
  12. start_link(distributed, Func, Args, Receiver) ->
  13. Node = ebb_work_manager:available_node(),
  14. start_link(Node, Func, Args, Receiver);
  15. start_link(Node, Func, Args, Receiver) ->
  16. try
  17. Result = spawn_link(Node, ?MODULE, worker,
  18. [Node, Func, Args, Receiver]),
  19. ebb_work_manager:start_work(Node),
  20. Result
  21. of
  22. Pid -> {ok, Pid}
  23. catch
  24. Error -> Error
  25. end.
  26. worker(Func, Args, Receiver) ->
  27. ebb_event:return(Receiver, apply(Func, Args)).
  28. worker(Node, Func, Args, Receiver) ->
  29. Ref = make_ref(),
  30. io:format("~p ~p: Worker thread started~n", [Node, Ref]),
  31. {_, _, Start} = erlang:now(),
  32. ebb_event:return(Receiver, apply(Func, Args)),
  33. {_, _, Finish} = erlang:now(),
  34. io:format("~p ~p: Worker thread finished, time ~p~n",
  35. [Node, Ref, Finish-Start]),
  36. ebb_work_manager:work_finished(Node).
  37. stop(Worker) ->
  38. exit(Worker, kill).