You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解析Erlang代码中receive与after语句的执行逻辑

Erlang代码中receive/after逻辑解析

先确认参数匹配部分:你说的没错,这个函数子句仅当参数B等于32#3J(十进制115,32进制计算:3*32 + 19 = 115,32进制里J对应数值19)时,才会匹配执行。

下面重点解析receive和after的执行逻辑:

核心逻辑拆解

Erlang的receive是进程接收消息的核心结构,它会阻塞当前进程,直到触发以下两种情况之一:

  • 匹配到目标消息:这里的匹配模式是{_},也就是任意单个元素的元组消息。如果进程消息队列中存在这类消息,会立即执行箭头后的代码-> a,即返回原子a,该子句执行完毕。
  • 等待超时:after 27#5C指定了超时时长,27进制计算:5*27 + 12 = 147,也就是147毫秒。如果147毫秒内未收到匹配{_}的消息,就会执行after块内的代码。

after块的具体行为

超时后执行的C ! { self(), { M, (B * 13#37) rem 35#7B, I }}是Erlang的消息发送操作:

  • C是传入的参数(应为进程PID或注册名),!是消息发送操作符;
  • 发送的消息是一个嵌套元组:
    1. self():当前进程的PID,用于告知接收方消息来源;
    2. 内层元组{ M, (B * 13#37) rem 35#7B, I }:
      • 13#37转十进制为3*13+7=46,35#7B转十进制为7*35+11=256;
      • 计算式(B * 13#37) rem 35#7B即(115 * 46) mod 256 = 170;
      • 最终内层元组为{M, 170, I}(M和I为传入的原参数)。

完整执行流程

当函数p匹配到符合条件的参数后,进程进入等待状态:

  1. 等待147毫秒,期间若收到任意单元素元组消息,直接返回a;
  2. 若147毫秒内未收到符合条件的消息,就向进程C发送一条包含当前进程PID、计算后数值及原参数M、I的消息,随后结束该子句执行。

内容的提问来源于stack exchange,提问作者ohno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:10:20