Erlang中的并发程序简介_Erlang

Erlang中基本的并发函数

1)  Pid =spwan(Mod,Func,Args) 创建一个新的进程来执行apply(Mod,Func,Args),与调用进程并列运行,会使用最新的代码定义模块。
2)  Pid!Message 向Pid进程异步发送Message,!为发送操作符
3)  Receive … end 接收消息

复制代码 代码如下:

 receive
           Pattern1[when Guard1]-> Expression1;
           Pattern2[whenGuard2]->Expression2;

         aftertime->
                   Expressions
         end.

内置函数erlang:system_info(process_limit)可找出所允许的最大进程数,默认为262144.
进程注册的内置函数有:
register(AnAtom,Pid)用名称注册Pid
uregister(AnAtom) 注销关联注册
whereis(AnAtom)->Pid|undefined 检查Pid是否注册
registered()->[AnAtom::atom()]返回系统里所有注册进程的列表。
 
并发程序模板:

复制代码 代码如下:

-module(ctemplate).
-compile(export_all).
 
start() ->
         Spwan(?MODULE,loop,[]).
 
rpc(Pid,Request) ->
         Pid! {self(),Request},
         receive
                   {Pid,Respone}->
                            Response
         end.
 
loop(X) ->
         receive
                   Any->
                            Io:format(“Received:~p ~n”, [Any]),
                            loop(X)
         end.

每当收到消息时会处理它并再次调用loop(),这一过程称为尾递归,无需消耗堆栈空间可以一直循环下去。
 
Erlang并发程序的错误处理建立在远程监测和处理错误的基础上,重点在补救而不是预防,几乎没有防御性代码,只有在错误后清理系统的代码,即让其他进程修复错误和任其崩溃。
 
程序在出错时立即崩溃的优点:
1)  不编写防御性代码,直接崩溃简单
2)  别人来修复
3)  不会使错误恶化
4)  第一时间举旗示意
5)  修复时不担心原因重在清理
6)  简化了系统架构
监视和连接类似,但监视是单向的,如果被监视的进程挂了会向监视进程发一“宕机“消息,而不是退出信号。基本错误处理函数有:

复制代码 代码如下:

-spec spwan_link(Fun) ->Pid
-spec spwan_monitor(Fun)-> {Pid,Ref}
-spec process_flag(trap_exit,true)
-spec link(Pid) ->true
-spec unlink(Pid) -> true
-spec erlang:monitor(process,Item) ->Ref
-spec exit(Why) -> none()

分布式模型:分布式erlang 和基于socket的分布式模型。分布式erlang运行在可信网络,通常在同一局域网的集群上,并受防火墙保护。基于socket的分布式模型基于TCP/IP不可信网络.
分布式Erlang的主要问题在于客户端可以自行决定在服务器上分裂出多种进程,适合于你拥有全部的机器,并且想在单台机器上控制他们。lib_chan 模块让用户能够显式控制自己的机器分裂出哪些进程。
 
为了在互联网上执行并发程序:

1)  确保4369端口对TCP和UDP都开发,该端口保留给epmd(Erlang端口映射守护进程)
2)  选择1个或一段连续的端口给分布式erlang使用,确保这些端口开放,例如:

复制代码 代码如下:

$erl  -name …-setcookie …  -kernelinet_dist_listen_min Min \
           Inet_dist_listen_maxMax

Rpc提供了许多远程调用服务,global里的函数可以用来在分布式系统里注册名称以及维护一个全连接的网络。

Erlang集群就是一组带有相同cookie的互连节点。创建cookie的三种方法:
1)  在文件$HOME/.erlang.cookie存放相同的cookie
2)  在Erlang启动时,可以用 –setcookie,例如

复制代码 代码如下:

$erl  -setcookieABCDEFG2048

3)  内置函数erlang:set_cookie(node(),C)在程序中指定

Erlang通过名为端口的对象与外部程序通信,如果想端口发送一个消息,这一消息就会被发往与端口相连的外部程序,来自外部程序的消息会变成来自端口的Erlang消息。创建端口的进程成为端口的相连进程,所有发往端口的消息都必须标明相连进程的PID,所有来自外部程序的消息都会发往相连进程。

时间: 2024-12-25 04:19:22

Erlang中的并发程序简介_Erlang的相关文章

Erlang中的匹配模式总结_Erlang

一.赋值时匹配 原子匹配 复制代码 代码如下: atom    = atom                        % atom another = another                     % another atom    = another                     % exception error 变量匹配 复制代码 代码如下: Var = 2.                              % 2 Var = 3 - 1.       

Erlang中的基本元素操作小结_Erlang

Erlang shell中,用句号加空格.tab或回车来结束表达式,%表示注释的起点,;隔离子句.模块是.erl 文件,库的头文件.hrl, shell中的编译时c(),外编译命令时erlc, 退出shell用q(),或erlang:halt(). 变量以大写字母开头,且不能重新绑定变量,只能一次性赋值,具有不可变状态.原子是全局的,不需要宏定义或包含文件,以小写字母开头,还可放在单引号内,是极简表达式.   元组(tuple)是一些数量固定的项目归组成单一实体{,}, 由于是匿名的,通常在第一

在Java内存模型中测试并发程序代码_java

让我们来看看这段代码:   import java.util.BitSet; import java.util.concurrent.CountDownLatch; public class AnExample { public static void main(String[] args) throws Exception { BitSet bs = new BitSet(); CountDownLatch latch = new CountDownLatch(1); Thread t1 =

Erlang中的Record详解_Erlang

在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP.Ruby或Python中的关联数组(Ruby中的Hash)是不可能的 在Ruby中我可以这样做: 复制代码 代码如下: server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10}  在Erlang的语法级别不支持这种表达 为了避免这种限制,Erlang虚拟机提供了一个伪数据

Erlang中的注册进程使用实例_Erlang

之前看到 Erlang 中的注册进程时,对注册并不理解,主要是不理解注册的原子的作用域.刚才突然想明白了: 复制代码 代码如下: 注册进程关联的原子具有全局作用域 也就是说关联了注册进程之后的原子可以全局被使用 Erlang 中的并发机制是通过消息邮箱实现的,进程间进行通讯的方式只有消息邮箱,而进程间通讯需要知道进程的进程号,而使用 spawn 产生新进程时会返回新进程的进程号供使用. 一个最简单的进程间通信的程序如下 复制代码 代码如下: -module(test). start() ->  

Erlang中的socket编程简单例子_Erlang

Erlang 中gen_tcp 用于编写TCP程序,gen_udp用于编写UDP程序.一个简单的TCP服务器echo示例: 复制代码 代码如下: Start_echo_server()->          {ok,Listen}= gen_tcp:listen(1234,[binary,{packet,4},{reuseaddr,true},{active,true}]),          {ok,socket}=get_tcp:accept(Listen),          gen_tc

Erlang并发编程介绍_Erlang

Erlang中的process--进程是轻量级的,并且进程间无共享.查了很多资料,似乎没人说清楚轻量级进程算是什么概念,继续查找中...闲话不提,进入并发编程的世界.本文算是学习笔记,也可以说是<Concurrent Programming in ERLANG>第五张的简略翻译. 1.进程的创建     进程是一种自包含的.分隔的计算单元,并与其他进程并发运行在系统中,在进程间并没有一个继承体系,当然,应用开发者可以设计这样一个继承体系.     进程的创建使用如下语法: 复制代码 代码如下:

Erlang中的映射组Map详细介绍_Erlang

主要是遇到 Map匹配的问题,所以顺便回忆一下 Erlang 中的映射组 Map,在其它语言中被称作 Hash 哈希或者 Dict 字典. Erlang 从 R17 版本开始支持映射组 创建映射组 Erlang 中的映射组用结构 #{} 表示,创建一个映射组可以这样 复制代码 代码如下: % 不管你怎么排序,最终结果都是按键的字典顺序排列的 #{ name => "wittyfox", age => 19 }. % => #{age => 20,name =&g

Erlang中的模块与模式匹配介绍_Erlang

模块是Erlang的基本代码单元,erl文件编译后以.beam作为扩展名,采用UTF8字符集,.erl文件示意如下: -module(模块名,与存放模块的文件名相同) -export([方法名/输入参数的个数]) 复制代码 代码如下: Method1( {a,b,c})->a*b*c; Mehtod2({d,e})->d-e. 模块属性有两种类型:预定义型和用户定义型.   Erlang中用于代表函数的数据类型被称为fun,相当于python中的lambda,一般用于 1)      对列表里