gen_server

本文详细解析了Erlang中的gen_server启动、gen_server:call和gen_server:cast过程,以及gen_server调用terminate的情况。gen_server启动时,通过start_link函数创建与supervisor链接的进程并执行init函数。call是同步调用,当返回{noreply, ...}时,gen_server不向调用者回复,而是继续循环等待其他消息,而reply则需要额外进程处理回复。cast则直接发送'$gen_cast'消息。terminate调用在不同情况下,如内部函数返回{stop, Reason...},trap exit并设置shutdown超时,gen_server:stop,父进程退出等场景下触发。" 119966669,10840526,Java高级编程:TCP与UDP网络编程详解,"['Java', '网络协议', 'TCP/IP', 'UDP', '网络编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gen_server 启动:

gen_server 的启动是通过两个函数,一个是 gen_server:start(), 一个是 gen_server:start_link().
两者的区别就在于start() 启动了一个单独的进而start_link() 使得两个进程link在了一起。

我们以start_link 为例,根据官方文档的描述, start_link 建立了连接到 supervisor 的一个进程,并且同步调用同模块下的init 函数,直到其返回才返回。
具体如下 :
1. gen_server:start_link() 调用 proc_lib:start_link() 创建了一个进程去执行init_it(), 主进程阻塞receive 等待返回。
2. init_it() 函数执行了我们定义的 init() 函数,返回给主进程消息, 并且一直执行loop 函数等待 call, cast, 和info 消息。

gen_server:call

call 函数是一个同步调用。
假定是pid1 call pid2(gen_server进程)

    进程Pid1 用`erlang:send()`发送给相应进程Pid2消息后, receive 等待返回, 此时Pid1 一直处于阻塞 状态。
    Pid2 为一个gen_server 行为模式的进程。 loop 函数等待到消息后, 处理相应的逻辑, 并返回reply。

除去错误等情况, 经常会用到的就是 使用{noreply, …..}作为返回值, 之后用gen_server:reply 来返回call.

我当时一直不明白为什么需要有两种不同的处理方式,却明明有同样的效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值