-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.