ebb_worker.erl 892 B

123456789101112131415161718192021222324252627282930313233343536373839
  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. ebb_event:return(Receiver, apply(Func, Args)),
  30. ebb_work_manager:work_finished(Node).
  31. stop(Worker) ->
  32. exit(Worker, kill).