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
相关产品推荐
相关产品推荐

