- 浏览: 2689932 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
在Erlang里:
1,创建和销毁进程非常快
2,进程间发送消息非常快
3,在所有的操作系统间进程行为一致
4,可以有大量的进程
5,进程不共享内存并且完全独立
6,与进程交互的唯一途径是发送消息
Concurrency Primitives
Example
Client-Server通信时需要通过self()传递client端PID
自定义让当前进程sleep T毫秒的方法
自定义Timer
每个进程都有一个mailbox
发送消息到该进程时,消息被放入mailbox
当程序运行到receive语句时,启动一个timer
读取mailbox中的第一条消息,匹配Pattern1,2,...,如果消息匹配了,则从mailbox中删除掉,并执行该Pattern后的表达式
如果receive语句中没有匹配的Pattern,则将该消息从mailbox中删除并放入save queue,然后下一条消息进来匹配
如果mailbox中没有一条消息是匹配成功的,则进程suspend并等待下一次新的消息进来,下次有新消息时save queue里的消息不会再匹配
一旦有消息匹配,则已经放入save queue的消息按到达进程的顺序重新进入mailbox,如果设置了timer,则清空save queue
如果在等待消息时timer到点,则执行ExpressionsTimeout表达式并将保存的消息按到达进程的顺序放入mailbox
publishing一个process identifier,这样系统里所有process都可以和这个process交互,发布的process称为registered process
BIFs:
Example
Example2
Concurrent Program Template
在loop里receive之后马上又调用loop,则loop称为tail-recursive方法
如果我们写一个方法F,F never returns,则需要确保在调用F之后不会调用其他方法,也不要将F用于List或Tuple的constructor,否则内存溢出
spawn with MFA:
使用Mod名、Func名和Args列表(成为一个MFA)来显式的调用spawn是确保系统动态加载代码(热修改)的正确方式
spawn with funs则不会动态加载代码
作业
Erlang Ring Benchmark
1,创建和销毁进程非常快
2,进程间发送消息非常快
3,在所有的操作系统间进程行为一致
4,可以有大量的进程
5,进程不共享内存并且完全独立
6,与进程交互的唯一途径是发送消息
Concurrency Primitives
Pid = spawn(Fun) Pid!Message receive Pattern1 [when Guard1] -> Expressions1; Pattern2 [when Guard2] -> Expressions2; ... after Time -> Expressions end
Example
-module(area_server). -export([loop/0]). loop() -> receive {rectangle, Width, Ht} -> io:format("Area of rectangle is ~p~n", [Width * Ht]), loop(); {circle, R} -> io:format("Area of circle is ~p~n", [3.14 * R * R]), loop(); Other -> io:format("I don't know what the area of a ~p is. ~n", [Other]), loop() end.
Client-Server通信时需要通过self()传递client端PID
-module(area_server). -export([start/0, area/2). start() -> spawn(fun loop/0). area(Pid, What) -> rpc(Pid, What). rpc(Pid, Request) -> Pid ! {self(), Request}, receive {Pid, Response} -> Response end. loop() -> receive {From, {rectangle, Width, Ht}} -> From ! {self(), Width * Ht}, loop(); {From, {circle, R}} -> loop(); {From, Other} -> From ! {self(), {error, Other}}, loop() end. %%%%%%%%%%%%% 1> Pid = area_server:start(). <0.36.0> 2> area_server:area(Pid, {rectangle, 10, 8}). 80 3> area_server:area(Pid, {circle, 4}). 50.2645
自定义让当前进程sleep T毫秒的方法
sleep(T) -> receive after T -> true end.
自定义Timer
-module(stimer). -export([start/2, cancel/1]). start(Time, Fun) -> spawn(fun() -> timer(Time, Fun) end). cancel(Pid) -> Pid ! cancel. timer(Time, Fun) -> receive cancel -> void after Time -> Fun() end.
每个进程都有一个mailbox
发送消息到该进程时,消息被放入mailbox
当程序运行到receive语句时,启动一个timer
读取mailbox中的第一条消息,匹配Pattern1,2,...,如果消息匹配了,则从mailbox中删除掉,并执行该Pattern后的表达式
如果receive语句中没有匹配的Pattern,则将该消息从mailbox中删除并放入save queue,然后下一条消息进来匹配
如果mailbox中没有一条消息是匹配成功的,则进程suspend并等待下一次新的消息进来,下次有新消息时save queue里的消息不会再匹配
一旦有消息匹配,则已经放入save queue的消息按到达进程的顺序重新进入mailbox,如果设置了timer,则清空save queue
如果在等待消息时timer到点,则执行ExpressionsTimeout表达式并将保存的消息按到达进程的顺序放入mailbox
publishing一个process identifier,这样系统里所有process都可以和这个process交互,发布的process称为registered process
BIFs:
register(AnAtom, Pid) unregister(AnAtom) whereis(AnAtom) -> Pid | undefined registered() -> [AnAtom::atom()]
Example
1> Pid = spawn(fun area_server:loop/0). <0.51.0> 2> register(area, Pid). true 3> area ! {rectangle, 4, 5}. Area of rectangle is 20 {rectangle,4,5}
Example2
-module(clock). -export([start/2, stop/0]). start(Time, Fun) -> register(clock, spawn(fun() -> tick(Time, Fun) end)). stop() -> clock ! stop. tick(Time, Fun) -> receive stop -> void after Time -> Fun(), tick(Time, Fun) end. %%%%%%%%%%%%%%%%%% 1> clock:start(5000, fun() -> io:format("TICK ~p~n", [erlang:now()]) end). 2> clock:stop().
Concurrent Program Template
-module(ctemplate). -compile(export_all). start() -> spawn(fun() -> loop([]) end). rpc(Pid, Request) -> Pid ! {self(), Request}, receive {Pid, Response} -> Response end. loop(X) -> receive Any -> io:format("Received:~p~n", [Any]), loop(X) end.
在loop里receive之后马上又调用loop,则loop称为tail-recursive方法
如果我们写一个方法F,F never returns,则需要确保在调用F之后不会调用其他方法,也不要将F用于List或Tuple的constructor,否则内存溢出
spawn with MFA:
spawn(Mod, FuncName, Args)
使用Mod名、Func名和Args列表(成为一个MFA)来显式的调用spawn是确保系统动态加载代码(热修改)的正确方式
spawn with funs则不会动态加载代码
作业
Erlang Ring Benchmark
发表评论
-
ECUG III -- Elrang中国用户组第三次活动
2008-11-06 11:00 2256详情请见: http://ecug.org/ 大家也帮忙宣传 ... -
Erlang内存管理和运行模式笔记
2008-09-25 16:40 5396Erlang进程非常轻量级 进程间通过消息传递进行通讯 进程接 ... -
Erlang:一个通用的网络服务器
2008-09-24 16:50 6154原文: Erlang: A Generalized TCP S ... -
Erlang里的make
2008-09-22 17:38 3750Erlang自带一个make工具 我们看一个例子 目录结构: ... -
介绍Erlang里的Record
2008-09-12 15:52 8594原文: Erlang: An Introduction to ... -
Erlang与ActionScript3采用JSON格式进行Socket通讯
2008-09-02 16:37 6316前提: 需要下载as3corelib来为ActionScrip ... -
Erlang的JSON库
2008-09-02 15:40 9362使用下列JSON库: http://www.lshift.ne ... -
Erlang和ActionScript3的Socket通讯
2008-09-02 13:18 2886server.erl -module(server). ... -
Erlang和Ruby的Socket通讯
2008-09-01 22:12 2322server.erl -module(server). ... -
Erlang实现简单Web服务器
2008-09-01 17:59 5791转贴一个简单的Web服务器: httpd.erl %% h ... -
Mnesia用户手册:五,Mnesia高级特性
2008-09-01 17:27 7060本章描述了构建分布式、容错的Mnesia数据库相关的高级特性: ... -
Mnesia用户手册:四,事务和其他访问上下文
2008-08-29 00:06 6832本章讲述Mnesia事务系统和事务属性,它们让Mnesia成为 ... -
Mnesia用户手册:三,构建Mnesia数据库
2008-08-27 21:46 9245本章详细介绍了设计Mnes ... -
Mnesia用户手册:二,Mnesia快速上手
2008-08-27 14:09 9131本章介绍了Mnesia: 1) ... -
Mnesia用户手册:一,介绍
2008-08-26 15:47 7797Mnesia是一个分布式数据 ... -
OTP Design Principles: Supervisor Behaviour
2008-08-26 00:06 3112Supervisor Behaviour是一个用来实现一个su ... -
gen_event例子:terminal_logger
2008-08-25 16:23 1667定义三个terminal_logger: $$ termina ... -
OTP Design Principles: Gen_Event Behaviour
2008-08-25 16:06 18101,事件处理原则 在OTP里,event manager是一个 ... -
gen_fsm例子:code_lock
2008-08-22 18:35 2145改了一下代码,可以run了: %% code_lock.erl ... -
OTP Design Principles: Gen_Fsm Behaviour
2008-08-22 17:29 18471,有限状态机 FSM,有 ...
相关推荐
8. **Erlang与其他技术的集成**:Erlang可以与其他语言如Java、Python等集成,用于构建混合系统。例如,使用Erlang的Ranch和Cowboy库可以构建高性能的Web服务器和API。 9. **实时性与并发性**:Erlang的实时性使其...
本书《Programming Erlang》旨在帮助读者理解和掌握如何使用Erlang编程语言来构建并行世界中的软件。从目录可以看出,本书首先介绍了Erlang的基础概念和安装指南,随后逐步深入到更高级的主题和技术细节。通过这种...
Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...
《Programming Erlang》是Joseph Armstrong所著的一本详细介绍Erlang编程语言的书籍。这本书旨在帮助读者理解Erlang的设计哲学、语法特性以及如何利用它来构建高效、容错的并发系统。Erlang是一种静态类型、函数式...
8. 数据类型与模式匹配:Erlang具有丰富的数据类型,如原子、列表、元组等,以及强大的模式匹配功能。源码中可以看到如何利用这些特性编写简洁且高效的代码。 9. 面向连接的网络编程:Erlang的inet模块提供了一套...
读书笔记:ErlangOTP设计原则中文文档
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
《Programming Erlang》是由Joe Armstrong编著的一本关于Erlang编程语言的经典著作。这本书深入浅出地介绍了Erlang的各个方面,旨在帮助读者理解和掌握这门强大的并发和分布式计算语言。 Erlang是一种静态类型、...
### 关于《Pragmatic Programming Erlang 第二版》的核心知识点概述 #### 一、书籍基本信息及背景介绍 《Pragmatic Programming Erlang 第二版》由Erlang之父Joe Armstrong撰写,是一本深入浅出地介绍了Erlang语言...
《Programming Erlang second edition》是Joe Armstrong的经典著作,它是Erlang编程语言领域的权威指南,该书第二版于2013年首次发行。书中不仅覆盖了Erlang的核心语言和框架基础知识,还包括了重要的社区项目,例如...
Concurrency is natural in Erlang. The real world actually has independent things communicating through messages. I’m an ex-physicist—we perceive the world by receiving messages. Packets of light and...
otp_win64_24.1.7.exe
RabbitMQ基于Erlang编程语言,因此在安装RabbitMQ之前,我们需要先安装Erlang环境。本文将涵盖以下几个关键知识点: 1. **Erlang安装**: Erlang是RabbitMQ的基础,因为RabbitMQ是用Erlang编写的。首先,我们需要...
Pragmatic Programmer,Pragmatic Programming,Pragmatic Bookshelf and the linking g device are trademarks of The Pragmatic Programmers,LLC. Every precaution was taken in the preparation of this book....
《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF