Erlang中的注册进程使用实例

 更新时间:2015年02月09日 09:51:01   投稿:junjie  
这篇文章主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下

之前看到 Erlang 中的注册进程时,对注册并不理解,主要是不理解注册的原子的作用域。刚才突然想明白了:

复制代码 代码如下:

注册进程关联的原子具有全局作用域

也就是说关联了注册进程之后的原子可以全局被使用

Erlang 中的并发机制是通过消息邮箱实现的,进程间进行通讯的方式只有消息邮箱,而进程间通讯需要知道进程的进程号,而使用 spawn 产生新进程时会返回新进程的进程号供使用。

一个最简单的进程间通信的程序如下

复制代码 代码如下:

-module(test).

start() ->
    spawn(?MODULE, loop, []).

loop() ->
    io:format("Waiting for new message.~n"),
    receive
        M -> io:format("New message: ~p~n", [M])
    end,
    loop().

在 Erlang Shell 中使用 c(test) 编译这个模块,之后就可以简单的使用了.

在下面的代码中,语句前面的注释表示解释,语句后面的注释表示输出值, % => 后面的值表示语句的返回值

复制代码 代码如下:

% 编译这个模块
c(test).

% 开启无限循环
Pid = test:start().
% Waiting for new message.                             % 新进程 spawn 后立刻运行
% => <0.35.0>                                          % 返回新进程的进程号

% 向进程发送消息
Pid ! 'message'.
% New message: message                                 % 接收到消息
% Waiting for new message.                             % 继续接收消息
% => message                                           % 语句返回值,而非进程返回消息


为了用户不用每次都 Pid ! 'message',可以加入一个 call 方法进行包装一下。
复制代码 代码如下:

call(Pid, M) ->
    Pid ! M.

这样就可以使用 test:call(Pid, 'message') 发送消息了。

但是这样写还有个明显的弊端,调用 call 时需要 Pid 参数,但是又不能去掉,因为需要进程号才能通信,所以使用时需要用户维护一个进程号。

而 Erlang 提供了注册进程的机制用来把原子关联到进程中,可以解决这个问题

使用 register(atom, Pid) 可以将 atom 关联到进程号为 Pid 的进程上,这个原子就

修改上面的 start 函数为

复制代码 代码如下:

start() ->
    register(testp, spawn(?MODULE, loop, [])).

这样,新的进程将关联到原子 testp,此时原子就可以当作 Pid 那样使用 "消息发送操作符" !
复制代码 代码如下:

testp ! 'message'

于是可以修改上面的 call 函数,去掉 Pid 参数,而使用关联后的原子,这个关联后的原子不止在模块内有效,在全局作用域中都是有效的。
复制代码 代码如下:

call(M) ->
    testp ! M.

因此使用注册进程修改后的程序如下
复制代码 代码如下:

-module(test).

start() ->
    register(testp, spawn(?MODULE, loop, [])).

loop() ->
    io:format("Waiting for new message.~n"),
    receive
        M -> io:format("New message: ~p~n", [M])
    end,
    loop().

call(M) ->
    testp ! M.


注册相关的 BIF
复制代码 代码如下:

% 注册 atom 到 Pid

register(atom, Pid).

% 取消 atom 的注册
unregister(atom).

% 返回 atom 关联的进程号,如果未关联,返回 undefined
whereis(atom).

% 返回系统中所有已注册的进程名
registered().

相关文章

  • Erlang中遍历取出某个位置的最大值代码

    Erlang中遍历取出某个位置的最大值代码

    这篇文章主要介绍了Erlang中遍历取出某个位置的最大值代码,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • Erlang初学:Erlang的一些特点和个人理解总结

    Erlang初学:Erlang的一些特点和个人理解总结

    这篇文章主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程、一切都是常量、轻量进程、进程端口映射及典型缺点等内容,需要的朋友可以参考下
    2015-02-02
  • Erlang中执行linux命令的两种方法

    Erlang中执行linux命令的两种方法

    这篇文章主要介绍了Erlang中执行linux命令的两种方法,本文着重讲解了erlang:open_port的使用,需要的朋友可以参考下
    2015-01-01
  • Erlang中的Record详解

    Erlang中的Record详解

    这篇文章主要介绍了Erlang中的Record详解,本文讲解了定义Record、创建Record、访问Record、更新Record、匹配Record和Guard语句、使用Record等内容,需要的朋友可以参考下
    2015-04-04
  • CentOS 6.5源码安装Erlang教程

    CentOS 6.5源码安装Erlang教程

    这篇文章主要介绍了CentOS 6.5源码安装Erlang教程,本文讲解了源码编译安装的过程和遇到的一些错误处理方法,需要的朋友可以参考下
    2015-01-01
  • Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

    Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

    这篇文章主要介绍了Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法,需要的朋友可以参考下
    2015-02-02
  • Erlang中的匹配模式总结

    Erlang中的匹配模式总结

    这篇文章主要介绍了Erlang中的匹配模式总结,本文讲解了赋值时匹配、流程控制中的匹配、消息传递匹配等内容,需要的朋友可以参考下
    2015-01-01
  • Erlang中的函数与流程控制介绍

    Erlang中的函数与流程控制介绍

    这篇文章主要介绍了Erlang中的函数与流程控制介绍,本文先是讲解了函数的一些知识,然后讲解了case语句和if语句及算术表达式等内容,需要的朋友可以参考下
    2015-01-01
  • Erlang IO编程之文件目录操作常用方法小结

    Erlang IO编程之文件目录操作常用方法小结

    这篇文章主要介绍了Erlang IO编程之文件目录操作常用方法小结,本文讲解了常用的文件操作如打开文件、读取文件、写入文件、删除文件等,需要的朋友可以参考下
    2015-01-01
  • Erlang项目内存泄漏分析方法

    Erlang项目内存泄漏分析方法

    这篇文章主要介绍了Erlang项目内存泄漏分析方法,本文讲解了分析方法、分析流程并找到问题原因和解决方法,需要的朋友可以参考下
    2015-02-02

最新评论