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

-module(eFaw).
-include("eFaw.hrl").
-export([
start/0 %% start app
, stop/0 %% stop app
, openF/2 %% Open a factory
, closeF/1 %% close a factory
, hireW/3 %% hire worker
, inWork/2 %% Insert async task
, inWorks/2 %% Insert async tasks
, syncWork/4 %% Insert sync task And wait for the result to receive
]).
start() ->
application:ensure_all_started(eFaw).
stop() ->
application:stop(eFaw).
openF(FName, Kvs) ->
fwKvsToBeam:load(FName, fwUtil:initCfg(Kvs)),
FChildSpec = #{
id => FName,
start => {fwWSup, start_link, [FName, FName:getV(?wMod)]},
restart => permanent,
shutdown => 300000,
type => supervisor,
modules => [fwWSup]
},
case supervisor:start_child(eFaw_sup, FChildSpec) of
{ok, _Pid} = Ret ->
io:format("IMY************** ~p~n", [Ret]),
fwFMgr:newQueue(FName),
hireW(FName:getV(?wFCnt), FName, false),
Ret;
ErrRet ->
?FwErr("open factory error ~p~n", [ErrRet]),
ErrRet
end.
hireW(WorkerNum, FName, IsTmp) when is_integer(WorkerNum), WorkerNum > 0 ->
case supervisor:start_child(FName, [IsTmp]) of
{ok, _Pid} ->
ignore;
ErrRet ->
?FwErr("hire worker error ~p~n", [ErrRet])
end,
hireW(WorkerNum - 1, FName, IsTmp);
hireW(_WorkerNum, _FName, _IsTmp) ->
ok.
closeF(FName) ->
supervisor:terminate_child(eFaw_sup, FName),
supervisor:delete_child(eFaw_sup, FName),
fwFMgr:delQueue(FName).
-spec inWork(FName :: atom(), Work :: term()) -> true | false.
inWork(FName, Work) ->
% fwQueue:in(FName, Work).
FTaskLen = fwQueue:size(FName),
FTMax = FName:getV(?fTMax),
FTLfl = FName:getV(?fTLfl),
WFCnt = FName:getV(?wFCnt),
if
FTaskLen > FTMax ->
%% The factory is overloaded
false;
FTaskLen == FTLfl ->
%% See factory if need to hire hourly worker
%io:format("IMY*****************try addddddddd~n"),
fwFMgr:chAddW(FName),
fwQueue:in(FName, Work);
FTaskLen < WFCnt ->
%% See if need to wake up idle workers
fwFMgr:chAwkW(FName),
fwQueue:in(FName, Work);
true ->
fwQueue:in(FName, Work)
end.
-spec inWorks(FName :: atom(), Works :: [term(), ...]) -> true | false.
inWorks(FName, Works) ->
FTaskLen = fwQueue:size(FName),
FTMax = FName:getV(?fTMax),
FTLfl = FName:getV(?fTLfl),
WFCnt = FName:getV(?wFCnt),
if
FTaskLen > FTMax ->
%% The factory is overloaded.
false;
FTaskLen == FTLfl ->
%% See factory if need to hire hourly worker
fwFMgr:chAddW(FName),
fwQueue:ins(FName, Works);
FTaskLen < WFCnt ->
%% See if need to wake up idle workers
fwFMgr:chAwkW(FName),
fwQueue:ins(FName, Works);
true ->
fwQueue:ins(FName, Works)
end.
-spec syncWork(FName :: atom(), RetTag :: atom(), Timeout :: pos_integer() | infinity, Work :: term()) -> true | false.
syncWork(FName, RetTag, Timeout, Work) ->
FTaskLen = fwQueue:size(FName),
FTMax = FName:getV(?fTMax),
FTLfl = FName:getV(?fTLfl),
WFCnt = FName:getV(?wFCnt),
if
FTaskLen > FTMax ->
%% The factory is overloaded.
false;
FTaskLen == FTLfl ->
%% See factory if need to hire hourly worker
fwFMgr:chAddW(FName),
fwQueue:in(FName, Work),
receive
{RetTag, Ret} ->
Ret
after Timeout ->
timeout
end;
FTaskLen < WFCnt ->
%% See if need to wake up idle workers
fwFMgr:chAwkW(FName),
fwQueue:in(FName, Work),
receive
{RetTag, Ret} ->
Ret
after Timeout ->
timeout
end;
true ->
fwQueue:in(FName, Work),
receive
{RetTag, Ret} ->
Ret
after Timeout ->
timeout
end
end.