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 OTP并发编程实战》这本中文版书籍,你将能够深入理解如何利用Erlang OTP构建高并发、高可用性的系统,学习到如何有效地使用各种 OTP 行为来设计和实现复杂的应用程序。书中可能涵盖了实际案例分析、...
### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...
通过对这些知识点的理解,我们可以深入到Erlang程序设计的精髓,从而更好地学习和利用Erlang编写出高效、可靠的系统。在`code`这个文件中,你可以找到实际的源码,通过阅读和分析,将理论知识与实践相结合,提升对...
erlang otp学习文档 学习还不错的
《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...
根据描述中的信息,Erlang语言被认为是“当今最有前途的程序设计语言之一”,这主要归功于其独特的设计哲学和高效的并发模型。 #### 二、Erlang语言的设计理念 Erlang的设计核心是面向并发世界。正如书中引用Joe ...
Erlang是一种为构建大规模并发系统而设计的函数式编程语言。它的核心特性包括轻量级进程(processes)、消息传递和故障隔离。Erlang以其容错性和高可用性著称,广泛应用于电信、分布式系统和实时计算领域。 压缩包...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信...总的来说,Erlang的学习涉及函数式编程思想、并发处理、分布式系统设计等多个方面,深入学习并实践这些知识点,将使你具备开发高效、可靠的并发应用程序的能力。
主要介绍了Erlang中的并发程序简介,本文讲解了Erlang中基本的并发函数、并发程序模板、程序在出错时立即崩溃的优点、为了在互联网上执行并发程序等内容,需要的朋友可以参考下
书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
这些示例通常会包括简单的并发程序设计、消息传递机制的应用以及错误处理等方面的内容。 - **性能测试**:通过对Erlang程序进行基准测试,可以直观地看到多核环境下程序的执行效率。这些测试结果可以帮助开发者了解...
总之,Erlang设计指南将引导你深入理解并发编程的世界,学习如何利用Erlang构建高效、容错的系统。通过阅读"Pragmatic Programming Erlang",你可以掌握Erlang的关键概念,如进程、消息传递、模式匹配、OTP和分布式...
这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...
Erlang是一门专为并发计算设计的编程语言,提供了高效的轻量级进程模型以支持高并发应用。它由Joe Armstrong、Robert Virding、Claes Wikström和Mike Williams等人撰写,并由CPiE-CN团队翻译成中文版。 在《Erlang...
"Erlang入门书籍"和"erlang程序设计"这样的资料可以帮助你深入理解这些概念,并提供实例来指导你的学习。通过学习和实践,你将能够利用Erlang的强大功能来创建高性能、高可用性的并发应用程序。
Erlang OTP并发编程实战是深入理解Erlang并发特性和 OTP(Open Telephony Platform)设计原则的关键资源。这本书的附书源码包含了14个章节的实例代码,旨在帮助读者通过实践掌握Erlang在分布式系统、容错以及高并发...