Erlang并发编程之消息传递

本文通过一个Erlang代码示例,展示了如何在并发环境中创建并管理两个进程,重点介绍了一个进程如何向另一个进程持续发送消息,揭示了Erlang并发编程中消息传递的基本机制。

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

下面是erlang教程的一份代码,其中创建了两个进程,其中一个重复向另一个发送消息。

module(tut15).
-export([start/0, ping/2, pong/0]).
ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("ping finished~n", []);
ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).
pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.
start() ->
    Pong_PID = spawn(tut15, pong, []),
    spawn(tut15, ping, [3, Pong_PID]).  


下面是解析:


-module(tut4). %模块名字为tut4
-export([start/0,ping/2,pong/0]). %导出函数 start函数参数0个  ping函数参数2个 pong函数参数0个

ping(0,Pong_PID)->  %如果ping的第一个参数是0,
	Pong_PID ! finished,  %向pid为Pong_PID的进程发送finised消息
	io:format("ping finished~n",[]);%格式化输出一条信息
ping(N,Pong_PID)-> %如果ping的第一个参数不是0
	Pong_PID ! {ping,self()}, %向pid为Pong_PID的进程发送消息,消息格式为{ping,pid},self()返回当前进程的pid
	receive  %接受消息
		pong->  %接受的消息如果是pong
		io:format("Ping recevived pong~n",[])  %格式化输出一条消息,注意,end之前没有标点符号
	end,
	ping(N-1,Pong_PID). %N-1然后继续调用ping

pong()->
	receive %接受消息
		finished-> %如果接收的消息是finised
			io:format("Pong finished~n",[]); %格式化输出一条消息
		{ping,Ping_PID}->  %如果接收的消息是{ping,pid}这种格式的消息
			io:format("Pong received ping~n",[]), %格式化输出一条消息
			Ping_PID ! pong, %向pid为Ping_PID的进程发送一个pong消息
			pong()  %继续调用pong。注意,end前面没有标点符号 也就是说,只有当pong接收到一个{ping,pid}消息时,才向ping发送消息并继续调用自己
	end.

start()->
	Pong_PID = spawn(tut4,pong,[]), %创建一个进程,并返回pid
	spawn(tut4,ping,[3,Pong_PID]). %创建另一个进程




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值