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

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

相关推荐
Rabitebla8 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
无心水13 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd13 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
La Pulga18 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd18 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白19 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
lisw051 天前
作为人类代理的大语言模型及其角色分类!
人工智能·学习·语言模型
Z21-X1 天前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生
坤坤子吖1 天前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
Rabitebla1 天前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习