了解到了部分队列的常用api使用方法,对昨天的代码进行了部分注释与少许修改
1.创建新的空队列:Q = queue:new().
2.向队列添加元素 (入队):Q1 = queue:in(Element, Q).
3.从队列获取并移除第一个元素 (出队):{Element, Q2} = queue:out(Q1).
4.获取队列的第一个元素而不移除:Element = queue:head(Q1).
5.获取队列的最后一个元素:Element = queue:tail(Q1).
6.判断队列是否为空:IsEmpty = queue:is_empty(Q).
7.获取队列的长度:Length = queue:len(Q).
-module(gen_server_test).
-export([start_link/0, add_job/1, work_wanted/0, job_done/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([test_job_centre/0]).
-define(SERVER, ?MODULE).
%%创建一个记录,记录中包含了一个工作队列,与下一个工作任务编号
-record(state, {jobs = queue:new(), next_job_number = 1}).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
add_job(Fun) ->
gen_server:call(?SERVER, {add_job, Fun}).
work_wanted() ->
gen_server:call(?SERVER, work_wanted).
job_done(JobNumber) ->
gen_server:call(?SERVER, {job_done, JobNumber}).
%%---------------------------------------------------------------------------
init([]) ->
{ok, #state{}}.
handle_call({add_job, Fun}, _From, State) ->
%%向队列中添加元素,队列的任务为执行Fun中的操作
NewJobs = queue:in({State#state.next_job_number, Fun}, State#state.jobs),
{reply, State#state.next_job_number, State#state{jobs = NewJobs, next_job_number = State#state.next_job_number + 1}};
handle_call(work_wanted, _From, State) ->
IsEmpty = queue:is_empty(State#state.jobs),
case IsEmpty of
true ->
{reply, no, State};
false ->
{{value, {JobNumber, Fun}}, NewJobs} = queue:out(State#state.jobs),
{reply, {JobNumber, Fun}, State#state{jobs = NewJobs}}
end;
handle_call({job_done, _}, _From, State) ->
{reply, ok, State};
handle_call(Request, _From, State) ->
{reply, {error, {unknown_request, Request}}, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
test_job_centre() ->
%%创建两个任务
Job1 = fun() -> io:format("Doing job 1~n") end,
Job2 = fun() -> io:format("Doing job 2~n") end,
%%将两个任务放入任务队列中
JobNumber1 = add_job(Job1),
io:format("Job number 1 is ~p~n", [JobNumber1]),
JobNumber2 = add_job(Job2),
io:format("Job number 2 is ~p~n", [JobNumber2]),
%%工人领取任务队列任务
{JobNumber1, Job1} = work_wanted(),
io:format("Doing job ~p~n", [{JobNumber1,Job1}]),
{JobNumber2, Job2} = work_wanted(),
io:format("Doing job ~p~n", [{JobNumber2,Job2}]),
%%表示任务完成
job_done(JobNumber1),
job_done(JobNumber2),
case work_wanted() of
no ->
io:format("No more jobs~n");
{JobNumber, Job} ->
io:format("Doing job ~p~n", [{JobNumber,Job}])
end,
ok.