OTP Design Principles: Gen_Server Behaviour

OTP Design Principles: Gen_Server Behaviour

1,Client-Server原则
client-server模型由一个中心服务器和任意多的客户端组成
该模型主要用来做资源管理操作,不同的客户端共享一个通用的资源,服务器负责管理该资源

2,例子
[code]
-module(ch3).
-behaviour(gen_server).

-export([start_link/0]).
-export([alloc/0, free/1]).
-export([init/1, handle_call/3, handle_cast/2]).

start_link() ->
gen_server:start_link({local, ch3}, ch3, [], []).

alloc() ->
gen_server:call(ch3, alloc).

free(Ch) ->
gen_server:cast(ch3, {free, Ch}).

init(_Args) ->
{ok, channels()}.

handle_call(alloc, _From, Chs) ->
{Ch, Chs2} = alloc(Chs),
{reply, Ch, Chs2}.

handle_cast({free, Ch}, Chs) ->
Chs2 = free(Ch, Chs),
{noreply, Chs2}.
[/code]

3,启动Gen_Server
ch3:start_link():
[code]
start_link() ->
gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}
[/code]
gen_server:start_link/4启动一个新进程并连接它,新进程为一个gen_server
1)第一个参数指定gen_server名字,{local, ch3}表示在本地注册一个gen_server进程为ch3
2)第二个参数指定callback module为ch3,在这里接口方法和callback方法都放在一个module里,这是一个好的编程实践
3)第三个参数指定init方法的参数
4)第四个参数为options
如果名字注册成功,新的gen_server进程调用callback方法ch3:init([]),返回{ok, State}
gen_server:start_link是同步的,直到gen_server初始化并且可以接收请求才返回,gen_server:start_link由supervisor启动,它是supervision tree的一部分
gen_server:start启动一个单独的进程,gen_server:start不是supervision tree的一部分,它没有supervisor

4,同步请求——Call
同步请求alloc()由gen_server:call/2实现:
[code]
alloc() ->
gen_server:call(ch3, alloc).
[/code]
ch3是gen_server的名字,alloc是实际的请求
该请求会发送一条消息给gen_server,请求接受以后,gen_server调用handle_call(Request, From, State)并返回{replay, Replay, State1}

5,异步请求——Cast
异步请求free(Ch)由gen_server:cast/2实现
[code]
free(Ch) ->
gen_server:cast(ch3, {free, Ch}).
[/code]
ch3是gen_server的名字,{free, Ch}是真正的请求
callback方法为handle_cast(Request, State),返回{noreply, State1}.

6,关闭
6.1 在Supervision Tree中
如果gen_server是supervision tree的一部分,则不需要stop方法。gen_server会被supervisor自动关掉。
如果需要在关闭gen_server之前做清理工作,那么shutdown strategy必须为一个timeout并且必须在gen_server的init方法中设置捕获exit信号
gen_server将在关闭时调用callback方法terminate(shutdown, State):
[code]
init(Args) ->
...,
process_flag(trap_exit, true),
...,
{ok, State}.
...
terminate(shutdown, State) ->
..code for cleaning up here..
ok.
[/code]

6.2 单独的Gen_Servers
如果gen_server不是supervision tree的一部分,那么定义一个stop方法会比较有用:
[code]
...
export([stop/0]).
...
stop() ->
gen_server:cast(ch3, stop).
...

handle_cast(stop, State) ->
{stop, normal, State};
handle_cast({free, Ch}, State) ->
...
...

terminate(normal, State) ->
ok.
[/code]
callback方法处理stop请求,然后返回{stop, normal, State1},norma指定这是一个正常的关闭,State1为gen_server的state的新的值
这将使得gen_server调用terminate(normal, State1),然后优雅的关闭服务器

7,处理其他消息
如果gen_server可以接受除了请求外的其他消息,那么callback方法handle_info(Info, State)必须实现来处理它们
例如gen_server连接到supervisor以为的其他进程并捕获到exit信号,这时就会接受一个exit消息
[code]
handle_info({'EXIT', Pid, Reason}, State) ->
..code to handle exits here..
{noreply, State1}.
[/code]

补充:gen_server exports and callbacks
[code]
gen_server module callback module
gen_server:start_link -------> Module:init/1
gen_server:start
gen_server:call -------------> Module:handle_call/3
gen_server:multi_call
gen_server:cast -------------> Module:handle_cast/2
gen_server:abcast
gen_server:replay
gen_server:enter_loop
Module:handle_info/2
Module:terminate/2
Module:code_change/3
[/code]
Opus 5与Codex语音模式:构建下一代智能语音交互系统实战 语音识别技术作为人工智能的重要分支,通过将人类语音转换为机器可理解的文本数据实现人机交互。其核心原理基于声学模型、语言模型和解码器的协同工作,采用深度学习算法对音频信号进行特征提取和模式匹配。在技术价值层面,高质量的语音识别能够显著提升交互效率,降低人工成本,并为无障碍访问提供支持。随着opus音频编码技术的演进和流式处理能力的增强,语音系统在实时性和准确性方面取得突破性进展。在实际应用场景中,智能客服、语音助手、实时翻译等领域对低延迟、高准确率的语音交互需求日益增长,这自然引出了对Opus 5架构和Cod 阅读详情

相关推荐

YOLOv8超参数自动搜索实战:Ray Tune与W&B集成指南

超参数优化是深度学习模型调优的关键环节,直接影响模型性能和收敛速度。通过自动化搜索算法替代传统手动调参,可以系统性地探索参数空间,找到全局最优解。Ray Tune作为分布式超参数优化框架,支持多种搜索算法和资源管理,与YOLOv8结合可实现高效参数搜索;Weights & Biases(W&B)则提供实验跟踪和可视化功能,两者配合形成完整的工作闭环。在目标检测、工业质检等场景中,这种自动化调参方案能显著提升模型mAP指标和开发效率。本文以YOLOv8为例,详解如何利用Ray Tune实现超参数自动搜索,并通

hideto 461

Erlang/OTP gen_server终极指南:构建高可靠分布式系统的核心模式

在构建高并发、分布式系统时,Erlang/OTP的gen_server行为模式是你必须掌握的核心技术。这个强大的服务器框架为开发者提供了标准化、可靠的进程管理方案,让你能够专注于业务逻辑而不是底层并发细节。无论你是Erlang新手还是经验丰富的开发者,理解gen_server都将显著提升你构建健壮系统的能力。 ## 🚀 项目简介与核心价值 Erlang/OTP是一个专门为构建高可用、分布式、

gitblog_00464的博客 465

Claude新架构解析:语义校验环折叠与FSM硬件加速

大语言模型推理中的语义一致性校验,传统上依赖高频动态计算,构成显著隐性开销。其原理在于通过实时监控输出分布保障意图连贯性,但带来显存带宽争抢、缓存污染与延迟激增等技术代价。随着模型部署向高并发、低延迟、边缘化演进,这类冗余计算层正成为性能瓶颈。Anthropic此次将语义保真度校验环(SFCL)重构为寄存器级有限状态机(FSM),实现从‘在线计算’到‘状态锚定’的范式跃迁,大幅释放GPU计算资源。该技术已落地客服对话、实时代码补全及Jetson Orin边缘推理等典型场景,在保持甚至提升输出质量前提下,实现

hideto 460

Erlang实现简单Web服务器

转贴一个简单的Web服务器: httpd.erl [code] %% httpd.erl - MicroHttpd -module(httpd). -author("ninhenry@gmail.com"). -export([start/0,start/1,start/2,process/2]). -import(regexp,[split/2]). -define(de...

hideto 378

OpenCV与dlib实现高效人脸识别系统开发指南

人脸识别作为计算机视觉的核心技术,通过特征提取与模式匹配实现身份验证。其技术原理主要基于深度学习模型将人脸图像转换为高维特征向量,再通过欧氏距离计算相似度。OpenCV+dlib组合因其优异的性能平衡成为开发首选,其中dlib提供的68点特征定位与ResNet模型能有效提取128维人脸特征。这种方案在相册管理、门禁系统等场景展现实用价值,特别适合需要处理批量图片的摄影后期与档案数字化场景。本方案通过调整识别阈值tolerance参数(建议0.4-0.6范围),可平衡召回率与准确率,实测在家庭相册整理中达到9

hideto 426

Android 13+ 精确定位适配:从 ACCESS_FINE_LOCATION 到前台服务 4 步实践

本文详细解析Android 13+精确定位适配策略,从权限声明到前台服务的完整实践指南。针对新版后台定位限制,提供四步实施方案:权限分级请求、前台服务定义、合规通知创建及位置更新处理,帮助开发者解决运动追踪、导航等场景下的持续定位需求,确保应用符合最新的隐私保护规范。

hideto 331

Erlang内存管理和运行模式笔记

Erlang进程非常轻量级 进程间通过消息传递进行通讯 进程接收消息时无法判断消息是共享的还是物理上复制过来的,这取决于Erlang运行时系统 每个进程都有一个邮箱,或者说是消息队列,队列中包含所有发给该进程的消息的指针 消息本身是一个term,存储在堆上 进程调用receive语句时会扫描邮箱直到找到第一个匹配的消息 发送消息时接收者由进程id来指定,而不管进程位于何处 Erl...

hideto 370

YOLO26算法水面与液体识别+训练好的模型+393张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 52 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.8528** mAP50-95 | 0.3441 Precision | 0.7729 Recall | 0.8354 train/box_loss | 1.5367 train/cls_loss | 1.0228 val/box_loss | 1.6809 val/cls_loss | 1.1758 【训练过程分析】 我这次训练了52个周期,模型在训练初期确实收敛速度很快,前20个周期mAP50从0.74逐步提升至0.82,这说明模型开始适应数据集,学习到一些关键特征。但到第30个周期后,提升速度逐渐放缓,到了40个周期时,mAP50达到0.85,这个阶段的曲线走势有些像磨砂玻璃,平滑且不规则,后期更是趋于平缓,表明模型可能已经达到最优解,再继续训练可能会有少量提升但代价较大。整体而言,从loss曲线来看,训练集的box_loss和cls_loss在52个周期内分别从1.80和1.25降到1.54和1.02,下降曲线较为稳定,但到了后期,这两项指标下降幅度逐渐减缓,尤其cls_loss下降至1.10左右后趋于稳定,这可能是模型对训练数据已有了较强的泛化能力,但也提示我们分类的稳定性可能还欠些火候。 至于验证集的表现,box_lo... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

Erlang里的make

Erlang自带一个make工具 我们看一个例子 目录结构: [code] --Emakefile -include --test.hrl -src --test.erl -ebin [/code] Emakefile: [code] {'src/*', [{i, "include"}, {outdir, "ebin"}]}. [/code] test...

hideto 321

AI大模型医学影像诊断智能识别应用方案.pptx

AI大模型医学影像诊断智能识别应用方案.pptx

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。

OTP Design Principles: Supervisor Behaviour

Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块 子进程可以是另一个supervisor,也可以是一个worker进程 worker进程一般使用gen_event,gen_fsm或gen_server behaviour来实现 一个使用该模块来实现的supervisor有一个接口方法的标准集,包括跟踪和错误报告的功能 supervis...

hideto 305

概率神经网络的分类预测-基于PNN的变压器故障诊断(Matlab代码实现)

内容概要:本文系统阐述了基于概率神经网络(PNN)的变压器故障诊断方法,结合Matlab代码实现分类预测。通过提取变压器运行过程中的关键特征参数,构建PNN模型以实现对正常状态与典型故障状态(如绕组短路、铁芯故障等)的高效分类识别。文章深入剖析了PNN的网络结构、概率密度估计原理、训练机制及分类决策过程,并通过仿真实验验证了该方法在故障诊断任务中具备较高的准确率与鲁棒性,展现了其在电力系统状态监测与智能运维中的良好应用前景。; 适合人群:具备一定机器学习理论基础和Matlab编程能力的电气工程、自动化、智能电网等相关领域的研究生、科研人员以及从事电力设备状态监测与故障诊断工作的工程技术人员。; 使用场景及目标:①实现变压器早期故障的智能化诊断与预警,提升电力系统运行安全性;②为基于神经网络的工业设备故障分类任务提供可复现的算法实现范例与技术验证平台; 阅读建议:建议读者结合文中提供的Matlab代码,动手复现实验流程,深入理解PNN在实际分类问题中的参数配置、训练策略、性能评估方法,并鼓励将该方法迁移至其他电力设备或机电系统的故障诊断场景中进行拓展研究与优化改进。

Erlang的JSON库

使用下列JSON库: [url]http://www.lshift.net/blog/2007/02/17/json-and-json-rpc-for-erlang[/url] 该JSON库采用[url=http://www.erlang.org/ml-archive/erlang-questions/200511/msg00193.html]Joe Armstrong prefered ...

hideto 250

Zemax实现微透镜阵列光束整形(原理+仿真)

通过Zemax实现微透镜阵列的光场整形仿真。

VJCP_90909Bu0的博客 1万+

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 433

gen_event例子:terminal_logger

定义三个terminal_logger: $$ terminal_logger1.erl [code] -module(terminal_logger1). -behaviour(gen_event). -export([init/1, handle_event/2, handle_call/2, handle_info/2, code_change/3, terminate/2])...

hideto 197

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 548

OTP Design Principles: Gen_Fsm Behaviour

1,有限状态机 FSM,有限状态机,可以用以下形式来描述做一个关系集: [code] State(S) x Event(E) -> Actions(A), State(S') [/code] 意思是,如果我们位于状态S,然后事件E发送了,则我们应该执行动作A,并且将状态改为S' 2,例子 有一个代码锁的门,如果输入的代码顺序是对的,那么将门打开30秒 如果输入代码不完全,则等待...

hideto 191

卸载Office 16 Click-to-Run Extensibility Component详细步骤

卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component

M_try的博客 3万+

莆田市C++专项选拔第一轮题4

现在小明同学想要从两堆硬币中各选择一枚硬币,使得两枚硬币的面值之和 不超过 k。不同的硬币组合,就算面值相同,也视为不同的方案。现在他把这些硬币分成了两堆,已知两堆硬币分别有 n 和 m 枚硬币。可选方案有: (1,2), (1,1), (1,1), (5,2), (5,1), (5,1),共 6 种。第一行三个整数 n, m, k,分别表示第一堆硬币的数量,第二堆硬币的数量,以及面值之和的上限。对于30%的数据,1 ≤ n , m ≤ 1000 , 1 ≤ b , c ≤ 1000。

lpstudio的博客 924

Erlang与ActionScript3采用JSON格式进行Socket通讯

前提: 需要下载[url=http://code.google.com/p/as3corelib/]as3corelib[/url]来为ActionScript3处理JSON codec server.erl [code] -module(server). -export([start/0,start/1,process/1]). -define(defPort, 8888). ...

hideto 171

医学影像处理实战:用SimpleITK将CT数据重采样到统一尺寸(附完整代码)

本文针对医学影像分析中多源CT数据尺寸不一致导致深度学习模型训练失败的问题,提供了基于SimpleITK的实战解决方案。通过深入解析图像尺寸与间距的关系,详细阐述了如何通过调整体素间距进行重采样,而非简单补零,从而在保持图像物理尺寸不变的前提下,将数据统一到固定尺寸,确保输入网络的3D数据空间对齐且解剖信息准确。

weixin_29062671的博客 269

ECUG III -- Elrang中国用户组第三次活动

详情请见: [url]http://ecug.org/[/url] 大家也帮忙宣传宣传

hideto 170

数据分析案例-2024年裁员数据集可视化分析

本实验数据集来源于Kaggle,原始数据集为2020-2024年裁员数据,共有3577条,12个变量,该数据集提供了不同公司的裁员信息。它包括以下几栏:Company:裁员发生的公司名称。Location_HQ:公司总部位置。Industry:公司所属的行业或部门。Laid_Off_Count:公司解雇的员工数量。Percentage:公司员工被解雇的百分比。Date:裁员发生的日期。Source:信息来源网址。Funds_Raised:公司募集资金的信息。

m0_64336780的博客 1万+

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9429
上一篇: OTP Design Principles Overview
下一篇: gen_server Hello World
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值