`

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 学习笔记1

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

    Erlang程序设计(第2版)1

    书中详细阐述了如何编写这样的并发程序,并探讨了编写分布式应用程序的关键技巧,如如何设计能够容忍错误和故障恢复的系统。 分布式系统设计是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 程序设计 源码

    通过对这些知识点的理解,我们可以深入到Erlang程序设计的精髓,从而更好地学习和利用Erlang编写出高效、可靠的系统。在`code`这个文件中,你可以找到实际的源码,通过阅读和分析,将理论知识与实践相结合,提升对...

    ERLANGOTP并发编程实战清晰中文版

    erlang otp学习文档 学习还不错的

    ErlangOTP并发编程实战

    《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...

    erlang 语言程序设计

    根据描述中的信息,Erlang语言被认为是“当今最有前途的程序设计语言之一”,这主要归功于其独特的设计哲学和高效的并发模型。 #### 二、Erlang语言的设计理念 Erlang的设计核心是面向并发世界。正如书中引用Joe ...

    Scala、Groovy++、Stackless Python、Erlang 学习笔记及分享

    Erlang是一种为构建大规模并发系统而设计的函数式编程语言。它的核心特性包括轻量级进程(processes)、消息传递和故障隔离。Erlang以其容错性和高可用性著称,广泛应用于电信、分布式系统和实时计算领域。 压缩包...

    erlang学习资料

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信...总的来说,Erlang的学习涉及函数式编程思想、并发处理、分布式系统设计等多个方面,深入学习并实践这些知识点,将使你具备开发高效、可靠的并发应用程序的能力。

    Erlang中的并发程序简介

    主要介绍了Erlang中的并发程序简介,本文讲解了Erlang中基本的并发函数、并发程序模板、程序在出错时立即崩溃的优点、为了在互联网上执行并发程序等内容,需要的朋友可以参考下

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    erlang学习相关资料

    Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.

    Erlang学习资料

    这些示例通常会包括简单的并发程序设计、消息传递机制的应用以及错误处理等方面的内容。 - **性能测试**:通过对Erlang程序进行基准测试,可以直观地看到多核环境下程序的执行效率。这些测试结果可以帮助开发者了解...

    erlang 设计指南

    总之,Erlang设计指南将引导你深入理解并发编程的世界,学习如何利用Erlang构建高效、容错的系统。通过阅读"Pragmatic Programming Erlang",你可以掌握Erlang的关键概念,如进程、消息传递、模式匹配、OTP和分布式...

    Erlang游戏程序学习完整PDF手册

    这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...

    erlang并发编程 .pdf

    Erlang是一门专为并发计算设计的编程语言,提供了高效的轻量级进程模型以支持高并发应用。它由Joe Armstrong、Robert Virding、Claes Wikström和Mike Williams等人撰写,并由CPiE-CN团队翻译成中文版。 在《Erlang...

    erlang并发编程

    "Erlang入门书籍"和"erlang程序设计"这样的资料可以帮助你深入理解这些概念,并提供实例来指导你的学习。通过学习和实践,你将能够利用Erlang的强大功能来创建高性能、高可用性的并发应用程序。

    Erlang OTP并发编程实战 附书源码

    Erlang OTP并发编程实战是深入理解Erlang并发特性和 OTP(Open Telephony Platform)设计原则的关键资源。这本书的附书源码包含了14个章节的实例代码,旨在帮助读者通过实践掌握Erlang在分布式系统、容错以及高并发...

Global site tag (gtag.js) - Google Analytics