You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.0 KiB

  1. -module(eFaw).
  2. -include("eFaw.hrl").
  3. -export([
  4. start/0 %% start app
  5. , stop/0 %% stop app
  6. , openF/2 %% Open a factory
  7. , closeF/1 %% close a factory
  8. , hireW/3 %% hire worker
  9. , inWork/2 %% Insert async task
  10. , inWorks/2 %% Insert async tasks
  11. , syncWork/4 %% Insert sync task And wait for the result to receive
  12. ]).
  13. start() ->
  14. application:ensure_all_started(eFaw).
  15. stop() ->
  16. application:stop(eFaw).
  17. openF(FName, Kvs) ->
  18. fwKvsToBeam:load(FName, fwUtil:initCfg(Kvs)),
  19. FChildSpec = #{
  20. id => FName,
  21. start => {fwWSup, start_link, [FName, FName:getV(?wMod)]},
  22. restart => permanent,
  23. shutdown => 300000,
  24. type => supervisor,
  25. modules => [fwWSup]
  26. },
  27. case supervisor:start_child(eFaw_sup, FChildSpec) of
  28. {ok, _Pid} = Ret ->
  29. io:format("IMY************** ~p~n", [Ret]),
  30. fwFMgr:newQueue(FName),
  31. hireW(FName:getV(?wFCnt), FName, false),
  32. Ret;
  33. ErrRet ->
  34. ?FwErr("open factory error ~p~n", [ErrRet]),
  35. ErrRet
  36. end.
  37. hireW(WorkerNum, FName, IsTmp) when is_integer(WorkerNum), WorkerNum > 0 ->
  38. case supervisor:start_child(FName, [IsTmp]) of
  39. {ok, _Pid} ->
  40. ignore;
  41. ErrRet ->
  42. ?FwErr("hire worker error ~p~n", [ErrRet])
  43. end,
  44. hireW(WorkerNum - 1, FName, IsTmp);
  45. hireW(_WorkerNum, _FName, _IsTmp) ->
  46. ok.
  47. closeF(FName) ->
  48. supervisor:terminate_child(eFaw_sup, FName),
  49. supervisor:delete_child(eFaw_sup, FName),
  50. fwFMgr:delQueue(FName).
  51. -spec inWork(FName :: atom(), Work :: term()) -> true | false.
  52. inWork(FName, Work) ->
  53. % fwQueue:in(FName, Work).
  54. FTaskLen = fwQueue:size(FName),
  55. FTMax = FName:getV(?fTMax),
  56. FTLfl = FName:getV(?fTLfl),
  57. WFCnt = FName:getV(?wFCnt),
  58. if
  59. FTaskLen > FTMax ->
  60. %% The factory is overloaded
  61. false;
  62. FTaskLen == FTLfl ->
  63. %% See factory if need to hire hourly worker
  64. %io:format("IMY*****************try addddddddd~n"),
  65. fwFMgr:chAddW(FName),
  66. fwQueue:in(FName, Work);
  67. FTaskLen < WFCnt ->
  68. %% See if need to wake up idle workers
  69. fwFMgr:chAwkW(FName),
  70. fwQueue:in(FName, Work);
  71. true ->
  72. fwQueue:in(FName, Work)
  73. end.
  74. -spec inWorks(FName :: atom(), Works :: [term(), ...]) -> true | false.
  75. inWorks(FName, Works) ->
  76. FTaskLen = fwQueue:size(FName),
  77. FTMax = FName:getV(?fTMax),
  78. FTLfl = FName:getV(?fTLfl),
  79. WFCnt = FName:getV(?wFCnt),
  80. if
  81. FTaskLen > FTMax ->
  82. %% The factory is overloaded.
  83. false;
  84. FTaskLen == FTLfl ->
  85. %% See factory if need to hire hourly worker
  86. fwFMgr:chAddW(FName),
  87. fwQueue:ins(FName, Works);
  88. FTaskLen < WFCnt ->
  89. %% See if need to wake up idle workers
  90. fwFMgr:chAwkW(FName),
  91. fwQueue:ins(FName, Works);
  92. true ->
  93. fwQueue:ins(FName, Works)
  94. end.
  95. -spec syncWork(FName :: atom(), RetTag :: atom(), Timeout :: pos_integer() | infinity, Work :: term()) -> true | false.
  96. syncWork(FName, RetTag, Timeout, Work) ->
  97. FTaskLen = fwQueue:size(FName),
  98. FTMax = FName:getV(?fTMax),
  99. FTLfl = FName:getV(?fTLfl),
  100. WFCnt = FName:getV(?wFCnt),
  101. if
  102. FTaskLen > FTMax ->
  103. %% The factory is overloaded.
  104. false;
  105. FTaskLen == FTLfl ->
  106. %% See factory if need to hire hourly worker
  107. fwFMgr:chAddW(FName),
  108. fwQueue:in(FName, Work),
  109. receive
  110. {RetTag, Ret} ->
  111. Ret
  112. after Timeout ->
  113. timeout
  114. end;
  115. FTaskLen < WFCnt ->
  116. %% See if need to wake up idle workers
  117. fwFMgr:chAwkW(FName),
  118. fwQueue:in(FName, Work),
  119. receive
  120. {RetTag, Ret} ->
  121. Ret
  122. after Timeout ->
  123. timeout
  124. end;
  125. true ->
  126. fwQueue:in(FName, Work),
  127. receive
  128. {RetTag, Ret} ->
  129. Ret
  130. after Timeout ->
  131. timeout
  132. end
  133. end.