`

erlang学习笔记(并发程序设计)

 
阅读更多

 See Also: http://www.erlang.org/course/concurrent_programming.html

Definitions

Creating a new process

Simple message passing

An Echo Process

Selective Message Reception

Selection of Any Message

A Telephony Example

Pids can be sent in messages

Registered Processes

The Client Server Model

Timeouts

 

Definitions定义

Process 轻量级进程,系统会有许多同时运行的process
Message	进程间通过消息通讯
Timeout	超时机制
Registered Process	注册了名称的进程
Client/Server Model

Creating a new process创建一个新进程

 

Pid1进程中执行如下代码
Pid2 = spawn(Mod,Func,Args)
Pid2是新进程的标识,只有Pid1知道

 

Simple Message Passing消息传递

 

%mesTest.erl

-module(mesTest).
-export([recvTest/0]).

recvTest() ->
        receive
                finished ->
                        io:format("program stopped!~n",[]);
                {From,Msg} ->
                        io:format("Received ~p ~p~n", [From,Msg])
        end.

1> c(mesTest).
{ok,mesTest}
2> Pid2 = spawn(mesTest,recvTest,[]).
<0.39.0>
3> Pid2!{self(),"Hello Pid2"}.
Receoved <0.32.0> "Hello Pid2"
{<0.32.0>,"Hello Pid2"}
4> Pid2!{self(),"Hello Pid2"}.	%Pid2进程已经结束
{<0.32.0>,"Hello Pid2"}
5>

self() 返回自身进程的pid

From 和 Msg 匹配收到的消息 (也可以调用Pid2!finished)

如果From之前已经被bound数据,那只有Msg会收到内容

An Echo Process

% echo.erl
-module(echo).
-export([go/0, loop/0]).
 
go() ->
Pid2 = spawn(echo, loop, []),
Pid2 ! {self(), hello},
receive 
{Pid2, Msg} ->
io:format("P1 ~w~n",[Msg])
end,
Pid2 ! stop.

loop() ->
receive
{From, Msg} -> 
From ! {self(), Msg},
loop();
stop ->
true
end.

执行echo:go().

Selective Message Reception

% echo.erl
-module(echo).
-export([test/0,selective/0,bfunc/1]).

selective() ->
        receive
                foo ->
                        io:format("Received foo from A~n",[])
        end,
        receive
                bar ->
                        io:format("Received bar from B~n",[])
        end.

bfunc(Cpid) ->
        Cpid ! bar.

test() ->
        Cpid = spawn(echo, selective, []),
        spawn(echo, bfunc, [Cpid]),
timer:sleep(1000),
        Cpid ! foo.
1> c(echo).
{ok,echo}
2> echo:test().
Received foo from A
foo
Received bar from B

Selection of Any Message

-module(echo).
-export([test/0,selective/0,bfunc/1]).
selective() ->
        receive
                Msg ->
                        io:format("Received ~w ~n",[Msg])
        end,
        receive
                Msg2 ->
                        io:format("Received ~w ~n",[Msg2])
        end.

bfunc(Cpid) ->
        Cpid ! bar.

test() ->
        Cpid = spawn(echo, selective, []),
        spawn(echo, bfunc, [Cpid]),
        timer:sleep(1000),
        Cpid ! foo.

1> c(echo).
{ok,echo}
2> echo:test().
Received bar
Received foo
foo

A Telephony Example

%这个例子没能理解

 

Pids can be sent in messages

% A 把自己的Pid发送给B,B再将A的pid给C,最终C直接向A回话
% echo.erl
-module(echo).
-export([test/0,bfunc/0,cfunc/0]).

cfunc() ->
        receive
                {_,Apid} ->
                        Apid ! foo
        end.

bfunc() ->
        receive
                {Cpid,Apid} ->
                        Cpid ! {"Call A",Apid}
        end.

test() ->
        %create b and c process
        Bpid = spawn(echo,bfunc,[]),
        Cpid = spawn(echo,cfunc,[]),

        Bpid ! {Cpid,self()},
        receive
                Mes ->
                        io:format("Received ~w from C ~n",[Mes])
        end.

1> c(echo).
{ok,echo}
2> echo:test().
Received foo from C
ok

Registered Processes

register(Alias, Pid) Registers the process Pid with the name Alias.

% echo.erl
-module(echo).
-export([test/0,bfunc/0,cfunc/0]).

cfunc() ->
        receive
                {_,Apid} ->
                        Apid ! foo
        end.

bfunc() ->
        receive
                {_,Apid} ->
                        cpid ! {"Call A",Apid}
        end.

test() ->
        %create b and c process
        Bpid = spawn(echo,bfunc,[]),
        Cpid = spawn(echo,cfunc,[]),
        register(cpid,Cpid),	%BPid可以通过cpid直接向C发送消息了

        Bpid ! {Cpid,self()},
        receive
                Mes ->
                        io:format("Received ~w from C ~n",[Mes])
        end.

Client Server Model

% myserver.erl
-module(myserver).
-export([start/0,server/0,request/1]).

handle(Reqdata) ->
        "Hello " ++ Reqdata.

server() ->
        io:format("server id = ~w ~n",[self()]),
        receive
                [From,{request,X}] ->
                        Resp = handle(X),
                        From ! {reply,Resp},
                        server()
        end.

start() ->
        register(serverid,spawn(myserver,server,[])).

request(Name) ->
        serverid ! [self(),{request,Name}],
        receive
                {reply,Res} ->
                        io:format("Get ~p from server!",[Res])
        after 5000 ->
                io:format("No response from server~n",[]),
                exit(timeout)
        end.

1> c(myserver).
{ok,myserver}
2> myserver:start().
server id = <0.39.0>
true
3> myserver:request("PJ").
server id = <0.39.0>
Get "Hello PJ" from server!ok
4>

Uses of Timeouts

分享到:
评论

相关推荐

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    Erlang程序设计(第2版)1

    书中详细阐述了如何编写这样的并发程序,并探讨了编写分布式应用程序的关键技巧,如如何设计能够容忍错误和故障恢复的系统。 分布式系统设计是Erlang的一大强项。Erlang允许开发者构建可以跨越多个节点运行的应用,...

    erlang 学习笔记1

    【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...

    erlang程序设计与入门

    通过消息传递实现进程间的通信,这种模型鼓励编写无共享的并发程序,降低了同步的复杂性和出错的可能性。 3. **分布式系统** Erlang天生支持分布式计算,可以轻松地在多台机器上运行程序。节点间通过简单的名字...

    Erlang程序设计,包含完整目录和全套源码

    这个压缩包包含了Erlang程序设计的完整目录和源码,是学习和理解Erlang编程的重要资源。 Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行...

    Erlang脚本在并发编程中的应用及其代码实现

    Erlang是一种专为并发和分布式系统设计的编程语言,它以轻量级进程、消息传递和强大的模式匹配机制而闻名。Erlang脚本在并发编程中的应用广泛,从简单的多进程通信到复杂的分布式系统构建,Erlang都能提供高效的解决...

    Erlang程序设计及源码

    对于初学者,可以通过阅读《Erlang程序设计》这本书了解基本语法、数据类型、控制结构、模式匹配以及Erlang的并发特性。同时,结合源码分析,可以提升实战能力。 总之,这份资源为Erlang初学者提供了全面的学习...

    Erlang程序设计(第二版)及源码

    书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、ETS和DETS等主题。...

    Erlang程序设计中文版

    通过阅读《Erlang程序设计中文版》并结合提供的完整书签,学习者可以逐步构建起对Erlang语言的全面理解,从而在实际工作中有效地运用Erlang解决复杂的问题。无论你是初学者还是有经验的开发者,这本书都能为你提供...

    [Erlang程序设计]源代码

    **Erlang程序设计源代码详解** Erlang是一种面向并发、函数式编程语言,尤其在分布式系统和高可用性领域表现出色。本资源包含了《Erlang程序设计》一书的所有实例代码,旨在帮助读者深入理解Erlang语言的核心特性和...

    Erlang OTP并发编程实战(中文版)

    阅读《Erlang OTP并发编程实战》这本中文版书籍,你将能够深入理解如何利用Erlang OTP构建高并发、高可用性的系统,学习到如何有效地使用各种 OTP 行为来设计和实现复杂的应用程序。书中可能涵盖了实际案例分析、...

    erlang学习笔记

    ### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...

    Erlang程序设计 第2版

    Erlang程序设计 第2版 Erlang程序设计 第2版Erlang程序设计 第2版

    erlang程序设计相关例子程序

    通过对这些文件名的分析,我们可以看出这些Erlang程序涵盖了并发处理、进程通信、异常处理、服务器设计、数据处理和测试等多个方面,体现了Erlang在构建分布式系统中的强大功能。学习并理解这些示例,对于深入掌握...

    Erlang程序设计及源代码打包

    学习Erlang不仅限于阅读《Erlang程序设计》这本书,还可以通过以下途径进一步提升: 1. **官方文档**:Erlang的官方文档提供了完整的语言参考和教程,是深入学习的重要资源。 2. **开源项目**:研究Erlang的开源...

    Erlang程序设计].源代码

    在"Erlang程序设计"].源代码这个压缩包中,我们可以找到学习和实践Erlang编程的相关材料。这些源代码可能是书中实例的实现,或者是针对Erlang编程技巧和概念的示例。通过阅读和分析这些源代码,你可以深入理解Erlang...

    Erlang程序设计中文版(完整书签).pdf

    这本书《Erlang程序设计》的中文版提供了全面的学习材料,帮助读者深入理解Erlang的核心概念和实践技巧。 在Erlang中,函数式编程的特点体现为没有变量的概念,程序主要由纯函数构成,这意味着函数的执行结果只取决...

Global site tag (gtag.js) - Google Analytics