这几天对gen_tcp有些疑惑便看了一下最基本的客户端服务器原理,对self()和PID 工作原理也产生了疑问。花了很多时间便有了的进一步理解。
从运行的结果看 Pid与self()发生了互换。因前面理解有误故对结果产生怀疑。
1、主要是我对rpc/2 中的self() 的值是哪里来的产生疑问。
Pid ! {self(),msg}
API中是这样描述的self() -> pid() Returns the pid (process identifier) of the calling process.
看了API后便有了得到一个进程标志的理解,这样理解没有什么错误。问题是我错误的认为
Pid ! {self(),msg}中的self()是得到了Pid(即Pid ! {self(),msg}中的Pid)中的进程标志(可以理解为实际得到的当前打开窗口的进程标志。)。因为错误的理解后面就对所有的运行结果产生了怀疑和不解。消息传递又两人相互发邮件来解释是最适合不过了。这样解释很容易明白但对程序便有了偏差。
2、最后我的理解是
rpc/2 中的self() 的是获得当前窗口的进程标志。
loop/0中的self()获得到当然是spawn(fun loop/0)后在loop中存活的进程标志。
3、以后分析问题会 先从当前共有几个进程在活动理解。会更好些。
-module(area_server_final).
-export([start/0, area/2]).
start() -> {spawn(fun loop/0),spawn(fun loop2/0)}.
area(Pid, What) ->
rpc(Pid, What).
rpc(Pid, Request) ->
S=self(),
io:format("~nPid=~p,self()=~p~n",[Pid,S]),
Pid ! {self(), Request},
receive
{Pid, Response} ->
{Pid,Response}
end.
loop() ->
receive
{From, {rectangle, Width, Ht}} ->
io:format("~nFrom rectangle=~p~n",[From]),
From ! {self(), Width * Ht},
loop();
{From, {circle, R}} ->
S = self(),
io:format("~nFrom circle=~p,self=~p~n",[From,S]),
From ! {self(), 3.14159 * R * R},
loop();
{From, Other} ->
io:format("~nFrom other=~p~n",[From]),
From ! {self(), {error,Other}},
loop()
end.
loop2() ->
receive
{From, Other} ->
S = self(),
io:format("~nFrom other=~pself()=~p~n",[From,S]),
From ! {self(), {error,Other}},
loop()
end.
运行结果:
14> {P1,P2}=area_server_final:start().
{<0.60.0>,<0.61.0>}
15> area_server_final:area(P2,22).
Pid=<0.61.0>,self()=<0.35.0>
From other=<0.35.0>self()=<0.61.0>
{<0.61.0>,{error,22}}
16> area_server_final:area(P1,{circle,22}).
Pid=<0.60.0>,self()=<0.35.0>
From circle=<0.35.0>,self=<0.60.0>
{<0.60.0>,1520.52956}
17>
分享到:
相关推荐
### Erlang中的Module级别热部署 #### 一、引言 Erlang 是一种专为构建高并发、容错性强的分布式系统而设计的编程语言。它的独特之处在于支持轻量级进程(也称为协程)和热部署能力。本文将深入探讨Erlang 中的 ...
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
用户可以在 Erlang Shell 中输入命令,例如数学运算符号,函数调用等。Erlang Shell 提供了一个交互式的环境,用户可以实时查看输出结果。 2. 顺序编程 顺序编程是 Erlang 编程语言的基础,用户可以使用 Erlang ...
### Erlang 中文基础教程:理解Erlang Shell与模块函数 #### 1. Erlang Shell:编程者的交互式环境 Erlang Shell是Erlang编程语言提供的一种交互式编程环境,允许开发者直接在命令行中编写、执行Erlang代码并观察...
- **1.3.1 进程**:Erlang的进程与其他语言中的线程类似,但它们是轻量级的,并且通过消息传递进行通信。 - **1.3.2 信息传递**:进程间通信是通过消息传递完成的,Erlang提供了简单的机制来实现这一点。 - **1.3.3 ...
诊断以及调试生产环境中的Erlang 系统。在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以...
Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...
以下是关于Erlang中DNS解析的一些核心知识点: 1. **inet** 模块:Erlang的标准库包含了`inet`模块,它提供了一系列的函数用于网络相关的操作,包括DNS查询。例如,`inet:gethostbyname/1,2`函数可以用来获取主机名...
**Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...
在Erlang中,与MySQL对接的关键在于选择合适的驱动程序,文件名为"erlang-mysql-driver"很可能是指一个Erlang的MySQL驱动库。这样的驱动库允许Erlang应用程序通过标准的数据库接口与MySQL进行通信。在Erlang中,这种...
在Erlang中,进程是并发执行的基本单元,它们轻量级且独立,彼此通过消息传递进行通信。下面将详细介绍Erlang中的进程以及如何使用它们进行并发开发。 1. 进程概念 在Erlang中,进程不同于操作系统中的线程或进程。...
文件中提到:“Erlang程序模拟我们的思考方式和互动方式。”这意味着Erlang的设计不仅仅是技术上的,还考虑到了人类的认知习惯。Erlang的编程模式和思想更接近于人们日常解决问题的方式,从而降低了学习和使用的门槛...
在IT行业中,Erlang是一种强大的并发编程语言,主要用于构建高可用性、容错性和分布式系统。当我们在处理中文字符时,特别是在Erlang环境中,可能会遇到“中文乱码”的问题。这个问题通常与字符编码、文件读写以及...
3. **环境变量**:安装过程中,安装程序可能会自动添加Erlang的bin目录到系统的PATH环境变量中,确保命令行可以识别`erl`等Erlang命令。 4. **验证**:安装完成后,打开命令行窗口并输入`erl`,如果Erlang成功安装,...
通过分析`ets_test.erl`源码,我们可以深入理解Erlang中的Record是如何与ETS结合使用的,以及如何在实践中提高代码效率和可维护性。不过,由于具体源码未给出,这部分只能进行推测,实际的内容还需要查看源码文件...
5. **并发与容错**:深入讨论Erlang如何通过进程隔离和消息传递实现高并发和容错。 6. **Mnesia**:Erlang的分布式数据库系统,支持事务和实时查询。 通过这两个文档的学习,你可以掌握Erlang的核心概念和技术,并...
在 Erlang 中,Port Driver 是一种机制,允许 Erlang 进程与外部 C 库或者其他语言编写的程序进行通信。Port Driver 提供了一种方式,使得 Erlang 系统能够与外部世界交互,执行低级别的I/O操作或调用非Erlang代码...
在Erlang中,函数是第一类公民,可以作为参数传递、返回结果,甚至存储在变量中。函数没有副作用,即它们不会改变外部状态,这有助于提高代码的可预测性和可测试性。 **并发与并行处理** Erlang的核心特性之一是其...
### Erlang与云计算知识点概述 #### 一、Erlang编程语言 **1.1 阶乘函数实现** 在Erlang中,阶乘函数可以通过递归方式实现。例如,给定的代码片段展示了如何定义一个计算阶乘的函数`fac`: ```erlang fac(N) when ...