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

Erlang中模块与进程的关系及相关技术疑问

Erlang模块与进程的关系解答

模块与进程的核心关系

Erlang的模块和进程是完全独立的两个概念:

  • 模块是代码的组织单元,用来封装函数、常量和属性,编译后以.beam文件形式存在,加载到BEAM虚拟机后作为“代码仓库”供所有进程调用。
  • 进程是BEAM的执行单元,拥有独立的栈、堆和消息队列,所有代码的执行都发生在某个进程的上下文里。
  • 两者没有绑定关系:一个模块可以被任意多个进程调用,一个进程也可以调用任意多个模块的函数。

模块是否会自动启动进程?

不会。模块的加载只是将代码载入虚拟机内存,完全不涉及进程创建。进程必须通过显式调用进程创建函数(比如spawn/1、spawn_link/1)来创建,不管这些函数定义在哪个模块中。

举个简单例子:

% 定义模块
-module(my_module).
-export([loop/0]).

loop() ->
    receive
        Msg -> io:format("Got ~p~n", [Msg]), loop()
    end.

编译并加载这个模块后,BEAM中不会新增任何进程。只有当执行spawn(fun my_module:loop/0)时,才会创建一个新进程来运行loop/0函数。

调用其他模块的函数是否涉及进程间消息传递?

不会,除非你显式使用消息传递操作(比如!操作符)或者OTP行为的异步接口(如gen_server:cast/2)。

直接调用其他模块的函数(比如OtherModule:func(Args))是同步函数调用,完全在当前进程的上下文里执行,和调用本模块函数的执行方式没有区别——只是代码来自另一个模块而已。

只有当你创建新进程,或者使用需要跨进程通信的OTP组件时,才会触发进程间的消息传递。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:45:35