erlang gen_server之my_job_center练习前三个功能的编写

%%%-------------------------------------------------------------------
%%% @author Jessamine
%%% @copyright (C) 2024, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 28. 8月 2024 23:33
%%%-------------------------------------------------------------------
-module(my_job_center).
-author("Jessamine").

%% API
-export([start_link/0, init/1, work_wanted/0, add_job/1, job_done/1, statistics/0, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3, handle_cast/3]).
start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
add_job(F) -> gen_server:call(?MODULE, {add, F}).
work_wanted() -> {JobNumber, F} = gen_server:call(?MODULE, get), F, job_done(JobNumber).
job_done(JobNumber) -> gen_server:cast(?MODULE, {complete, JobNumber}).
%% 让它报告队列内、进行中和已完成任务的状态
statistics() -> gen_server:call(?MODULE, statistics).
%% 启动服务器
%% 并初始化当前队列的任务数量为0以及任务已经发布到的编号
init([]) -> {ok, ets:new(?MODULE, [])}.
%% State = pending等待,doing正在做,done完成
handle_call({add, F}, _From, Tab) ->
	NewJobNumber = case ets:lookup(Tab, job_count) of
									 [] ->
										 FirstNumber = 1,
										 InitIndex = 1,
										 ets:insert(Tab, {job_count, FirstNumber}),
										 ets:insert(Tab, {current_job_index, InitIndex}),
										 FirstNumber;
									 [{job_count, JobNumber}] ->
										 JobNumber + 1
								 end,
	ets:insert(Tab, {NewJobNumber, {F, pending}}),
	ets:insert(Tab, {job_count, NewJobNumber}),
	NewJobNumber,
	{reply, NewJobNumber, Tab};
%%获取任务,并将任务状态改为doing
handle_call(get, _From, Tab) ->
	Count = case ets:lookup(Tab, job_count) of
						[] -> no;
						[{job_count, JobCount}] -> JobCount
					end,
	[{current_job_index, CurrentJobIndex}] = ets:lookup(Tab, current_job_index),
	Reply = if (Count =:= CurrentJobIndex) or (Count =:= no) ->
		no;
						true ->
							[{CurrentJobIndex, {F, _}}] = ets:lookup(Tab, CurrentJobIndex),
							ets:insert(Tab, {current_job_index, CurrentJobIndex + 1}),
							ets:insert(Tab, {CurrentJobIndex, {F, doing}}),
							{CurrentJobIndex, F}
					end,
	{reply, Reply, Tab}.
%% 完成任务,并将任务状态改为done
handle_cast({complete, JobNumber}, _From, Tab) ->
	case ets:lookup(Tab, JobNumber) of
		[] -> not_found;
		[{JobNumber, {F, _}}] -> ets:insert(Tab, {JobNumber, {F, done}})
	end,
	{noreply, Tab}.

handle_cast(_Msg, State) -> {noreply, State}.
%%	回调函数handle_info(Info, State)被用来处理发给服务器的自发性消息。自发性消息是
%%	一切未经显式调用gen_server:call或gen_server:cast而到达服务器的消息
handle_info(_Info, State) -> {noreply, State}.
%%	服务器会因为许多原因而终止。某个以handle_开头的函数也许会返回一个{stop, Reason,NewState},
%%	服务器也可能崩溃并生成{'EXIT', reason}。在所有这些情况下,无论它们是怎样发生的,都会调用terminate(Reason, NewState)。
terminate(_Reason, _State) -> ok.
%%	你可以在服务器运行时动态更改它的状态。这个回调函数会在系统执行软件升级时由版本处理子系统调用。
code_change(_OldVsn, State, _Extra) -> {ok, State}.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值