Erlang 进程与消息传递
了解 Erlang 的核心并发原语:进程。学习进程如何通过异步消息传递进行通信,并构建相互隔离的轻量级并发单元。
Erlang 进程与消息传递 是 CoddyKit 上的免费 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Erlang's Core: The Process
The fundamental unit of Erlang concurrency is the process: a tiny, independent program running alongside others, far lighter than an OS thread.
Why Erlang Processes?
Erlang processes are lightweight (millions per machine), isolated (no shared memory), concurrent, and talk only via async messages.
Spawning a New Process
You create a process with spawn, passing a module, function, and args. It returns a unique PID identifying the new process.
-module(process_spawn).
-export([start/0, hello_world_process/0]).
hello_world_process() ->
io:format("Hello from a new Erlang process!~n").
start() ->
% Spawns a new process running hello_world_process/0
Pid = spawn(process_spawn, hello_world_process, []),
io:format("Spawned process with PID: ~p~n", [Pid]).Understanding Process IDs (PIDs)
Every process gets a unique PID — its postal address. You need that PID to send it any message; it looks like <0.80.0>.
Sending Messages with '!'
Processes talk by messages, never shared memory. Send one with the ! operator: Pid ! Message, where the message is any Erlang term.
-module(message_sender).
-export([start/0, receiver_process/0, sender_process/1]).
receiver_process() ->
io:format("Receiver process ~p started.~n", [self()]),
% This process will just print its PID for now.
% It doesn't receive messages in this version.
timer:sleep(1000). % Keep process alive for a moment
sender_process(ReceiverPid) ->
io:format("Sender process ~p sending message to ~p...~n", [self(), ReceiverPid]),
ReceiverPid ! {hello, "from sender"},
io:format("Message sent!~n").
start() ->
ReceiverPid = spawn(message_sender, receiver_process, []),
io:format("Receiver spawned with PID: ~p~n", [ReceiverPid]),
sender_process(ReceiverPid).Receiving Messages: 'receive'
A process pulls messages from its mailbox with receive, which pattern-matches each one and waits (or times out) until a match arrives.
-module(message_receiver).
-export([start/0, my_receiver/0, my_sender/1]).
my_receiver() ->
io:format("Receiver ~p waiting for messages...~n", [self()]),
receive
{hello, Msg} ->
io:format("Receiver ~p received: ~p~n", [self(), Msg]);
_AnyOtherMessage ->
io:format("Receiver ~p received an unexpected message: ~p~n", [self(), _AnyOtherMessage])
end,
io:format("Receiver ~p finished.~n", [self()]).
my_sender(ReceiverPid) ->
io:format("Sender ~p sending message to ~p.~n", [self(), ReceiverPid]),
ReceiverPid ! {hello, "World"},
io:format("Sender ~p sent message.~n", [self()]).
start() ->
ReceiverPid = spawn(message_receiver, my_receiver, []),
timer:sleep(100), % Give receiver time to start
my_sender(ReceiverPid).A Full Messaging Example
Here is the full flow in one example: spawn a server, the client sends a request, and the server receives and replies.
-module(full_message_example).
-export([start/0, server_loop/0, client_action/1]).
server_loop() ->
io:format("Server ~p started, waiting for requests...~n", [self()]),
receive
{request, ClientPid, Message} ->
io:format("Server ~p received request from ~p: ~p~n", [self(), ClientPid, Message]),
ClientPid ! {response, self(), "Got your message!"};
_Other ->
io:format("Server ~p received unexpected: ~p~n", [self(), _Other])
end.
client_action(ServerPid) ->
io:format("Client ~p sending request to server ~p...~n", [self(), ServerPid]),
ServerPid ! {request, self(), "Can you hear me?"},
receive
{response, ServerPid, Reply} ->
io:format("Client ~p received reply from ~p: ~p~n", [self(), ServerPid, Reply])
end.
start() ->
ServerPid = spawn(full_message_example, server_loop, []),
timer:sleep(100), % Give server time to start
client_action(ServerPid).Asynchronous Communication
Erlang messaging is asynchronous: the sender drops the message in the mailbox and keeps going, never blocking on the receiver.
The Process Mailbox
Each process has a private mailbox where incoming messages queue. A receive scans it for a pattern match, usually in arrival order.
Knowing Your Own PID: `self()`
The built-in self() returns the current process's PID — handy for messaging yourself or embedding a reply address in a message.
-module(self_example).
-export([start/0, print_self/0]).
print_self() ->
io:format("Hello, my PID is: ~p~n", [self()]).
start() ->
io:format("Parent process PID: ~p~n", [self()]),
spawn(self_example, print_self, []).
Quick Check: Message Flow
Consider the following sequence of events in Erlang:
- Process A spawns Process B.
- Process A sends a message to Process B.
- Process B receives the message.
Which of the following statements about this interaction are true?
Recap: Processes & Messaging
Recap: processes communicate by async messages — spawn returns a PID, ! sends, receive matches, each has a mailbox, and self() gives your own PID.
常见问题解答
「Erlang 进程与消息传递」课时是免费的吗?
是的 — 「Erlang 进程与消息传递」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课程的其余内容,请升级到 CoddyKit PRO。 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课程共包含 4 节课。
「Erlang 进程与消息传递」这节课中我会学到什么?
了解 Erlang 的核心并发原语:进程。学习进程如何通过异步消息传递进行通信,并构建相互隔离的轻量级并发单元。 你通过在浏览器中直接运行的动手代码来练习 Erlang OTP: Distributed & Fault-Tolerant Systems Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Erlang 进程与消息传递」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课中编写并运行代码吗?
能。每节 Erlang OTP: Distributed & Fault-Tolerant Systems Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Erlang 与 VM 入门
- Erlang 进程与消息传递
- 基本并发模式
- 模式匹配与守卫