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)操作才行

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

相关推荐
知识分享小能手34 分钟前
Flask入门学习教程,从入门到精通,数据库操作 — 知识点详解与案例代码(4)
数据库·学习·flask
wubba lubba dub dub7502 小时前
第四十八周学习周报
学习
生成论实验室2 小时前
用事件关系网络重新理解AI(三):激活函数、微调与元学习
人工智能·学习·算法·语言模型·可信计算技术
辰海Coding2 小时前
MiniSpring框架学习-为什么一个请求访问 /helloworld,最后能调用到某个 Controller 方法?原始 MVC实现
java·学习·程序人生·spring·mvc
凉、介2 小时前
深入理解 ARMv7-A|异常/中断处理
笔记·学习·嵌入式·arm
wxytxdy3 小时前
通过猜数字游戏学习Shell脚本的分支、循环编写
linux·学习
我想我不够好。3 小时前
观察对方打野的动向,预判下一次gank的时机
学习
java小吕布4 小时前
Hermes Agent:自带学习闭环的开源 AI 智能体,一键部署全平台可用
人工智能·学习·开源
东风破1374 小时前
达梦DEM和DFM的介绍、搭建学习记录
数据库·学习·dm达梦数据库
希冀1234 小时前
【CSS学习第十二篇】
css·学习·tensorflow