erlang学习:用OTP构建系统23.12练习题

练习要求

制作一个名为prime_tester_server的gen_server,让它测试给定的数字是否是质数。

你可以使用lib_primes.erl里的is_prime/2函数来处理(或者自己实现一个更好的质数测试函

数)。把它添加到sellaprime_supervisor.erl的监控树里。

质数判断server实现

erlang 复制代码
-module(prime_tester_server).
-behaviour(gen_server).

-export([start_link/0]).
-export([test_prime/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  terminate/2, code_change/3]).

%% 初始化
init(_Args) ->
  {ok, []}.

%% 处理调用请求
handle_call({test_prime, Number}, _From, State) ->
  is_prime(Number),
  {reply, {ok, is_prime(Number)}, State}.

%% 处理消息投递
handle_cast(_Msg, State) ->
  {noreply, State}.

%% 处理信息
handle_info(_Info, State) ->
  {noreply, State}.

%% 终止回调
terminate(_Reason, _ServerState) ->
  ok.

%% 版本变更回调
code_change(_OldVsn, State, _Extra) ->
  {ok, State}.

%% 启动服务器
start_link() ->
  gen_server:start_link({local, prime_tester_server}, ?MODULE, [], []).

%% 测试质数
test_prime(Number) ->
  gen_server:call(prime_tester_server, {test_prime, Number}).

%% 质数检测函数
is_prime(Number) when Number < 2 -> false;
is_prime(2) -> true;
is_prime(Number) ->
  lists:all(fun(X) -> Number rem X =/= 0 end, lists:seq(2, trunc(math:sqrt(Number)))).

监控树实现

erlang 复制代码
-module(sellaprime_supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).

start_link() ->
  supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(_) ->
  ChildSpecs = [
    % 添加 prime_tester_server 到监督树
    {tag1,
      {prime_tester_server, start_link, []},
      permanent,
      10000,
      worker,
      [prime_tester_server]}
  ],
  {ok, {{one_for_one, 5, 10}, ChildSpecs}}.

测试结果

能够正常启动监控树与服务器,但是在进行报错测试后,之后服务器没有正常重启

erlang 复制代码
-module(sellaprime_supervisor).
-behaviour(supervisor).
-export([start_link/1, init/1,test/0]).

test() ->
  {ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []),
  unlink(Pid).
start_link(Args) ->
  supervisor:start_link({local, ?MODULE}, ?MODULE, Args).
init(_) ->
  ChildSpecs = [
    % 添加 prime_tester_server 到监督树
    {prime_tester_server,
      {prime_tester_server, start_link, []},
      permanent,
      10000,
      worker,
      [prime_tester_server]}
  ],
  {ok, {{one_for_one, 5, 10}, ChildSpecs}}.

查找了很久,需要在监控树中进行unlink(Pid)操作才行

修改后就能重启了,与预期相符

相关推荐
deng-c-f7 小时前
Linux C/C++ 学习日记(28):KCP协议(四):如何实现更复杂的业务:将连接状态的管理进行封装,用户只需实现发送、接收、断开的处理逻辑。
学习·网络编程·kcp
立志成为大牛的小牛10 小时前
数据结构——二十三、并查集的终极优化(王道408)
开发语言·数据结构·笔记·学习·程序人生·考研
QT 小鲜肉11 小时前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
QT 小鲜肉13 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
A9better14 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习
ha204289419414 小时前
Linux操作系统学习之---线程控制
java·linux·学习
Laplaces Demon16 小时前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
青衫码上行17 小时前
【从0开始学习Java | 第22篇】反射
java·开发语言·学习
hmbbcsm17 小时前
python学习之路(四)
学习
Greedy Alg17 小时前
Socket编程学习记录
网络·websocket·学习