ebb_worker.erl 1.5 KB

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