`
androider
  • 浏览: 757213 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

在Erlang程序里处理状态 转自gigix

阅读更多
从题外话说起:据我亲身经历,很多令人郁结的程序员最大的问题不是不熟悉语言和类库,不是不了解算法,不是不会用工具,而是对程序里的信息流没有概念——弄不清哪些信息应该在什么地方、信息从哪里来、经过怎样的转换、到哪里去。而顺序化编程语言(C、C++、Java、C#……)很大程度上加重了这个毛病:在一些不那么漂亮的代码里经常可以看到被滥用的static方法和变量,说到底还是不恰当的全局变量的延续,说到底还是没弄清楚哪些信息应该在哪些位置出现。

而Erlang的编程练习对此很有帮助。没有全局变量,变量赋值后就不能改变。于是一些常见的bad smell自然而然地就不会出现了,一些常用的重构手法自然而然地就用不上了。不过呢,这个世界毕竟是有状态的。比如说一个Stomp server就需要记住哪个client订阅了哪个频道。于是当你认真思考“什么信息应该在什么地方”这个问题时,Erlang的几种选择就显得很有意思了。

参数传递。只有当你认真思考的时候,你才会发现原来很多信息都是很容易得到的。要控制一个函数的行为,最简单也最常用的办法就是改变传递给它的参数。如果这个函数需要一种新的状态,也许那意味着给它增加一个参数。

进程字典 。调用put和get方法可以把信息放入一个“每个进程一个实例”的字典。例如random 在字典里放了一个名叫random_seed的变量,用来生成伪随机数。

ETS 。同样是一张二维表,ETS里的信息是所有进程都能访问的。例如Stomperl 需要记录哪个client订阅哪个mailer进程,显然所有监听socket的进程都需要了解这个订阅信息,才能正确分发消息。于是订阅信息就应该(至少)在ETS里保存。

DETS 。ETS只在内存中存在,这意味着两件事:第一,程序结束数据就消失;第二,数据只能在一个节点共享。DETS的API和ETS相似,但它是基于文件的,所以持久保存和多节点共享都是题中应有之义。注意,ETS和DETS保存的数据都必须是tuple。

Mnesia 。这是一个真正的数据库。功能齐备,并且仍然软实时。

以上四种方式的排列不是随机的。应该首先考虑靠前的手段,如果有明确的理由表明一种手段不能满足需要时才可以考虑比较靠后的手段。这很费脑子,有时让人沮丧。但经过深思熟虑的程序好过不假思索的程序,发现自己犯错好过犯错而不自知。

分享到:
评论

相关推荐

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    编写分布式的Erlang程序:陷阱和对策

    在探讨编写分布式的Erlang程序时,本篇文章聚焦于Erlang编程语言中的分布式特性,尤其是那些容易忽视的陷阱及其对应的解决方案。Erlang作为一种专为构建高度并发、容错性强的分布式系统的编程语言,其特性非常适合...

    erlang 程序设计 源码

    在深入理解Erlang程序设计的源码之前,我们需要了解Erlang的一些核心概念和特性。 1. **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes,LWP),它们类似于操作系统中的线程,但资源消耗小得多...

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

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

    erlang 语言程序设计

    通过以上介绍可以看出,Erlang语言作为一种专为并发世界而生的编程语言,在处理高并发场景方面具有独特的优势。无论是对于希望了解现代软件架构的初学者还是寻求优化现有系统的高级开发者来说,Erlang都是一项值得...

    erlang编程 Introducing Erlang

    Erlang采用“let it crash”哲学,鼓励程序在遇到错误时立即崩溃,而不是尝试恢复。这样可以快速暴露问题,便于系统自我修复。Supervision树(Supervisor Trees)是处理故障的一种机制,它能自动重启失败的进程。 #...

    erlang趣学指南

    这本书的作者Fred Hébert是一位在一线拥有丰富实战经验的工程师,他通过轻松幽默的文风和清晰的讲解,向读者介绍了Erlang的模块、函数、类型、递归、错误处理、数据结构、并行编程、多处理、事件处理以及Erlang的...

    Erlang UTF-8 转 Unicode 的字典程序

    在处理字符编码时,Erlang支持多种编码格式,其中包括UTF-8和Unicode。在Erlang中,UTF-8是一种常见的用来表示Unicode字符的编码方式,因为它既能有效地存储大多数常见字符,又具有良好的向后兼容性。 在Erlang R14...

    Erlang 程序设计 中文 + 英文 pdf

    在Erlang中,`spawn`函数用于创建新进程,`send`和`receive`用于进程间通信,`links`和`monitors`用于监控进程状态,`gen_server`行为则提供了一种标准的方式来实现服务器进程,它包含错误处理和状态管理。...

    erlang -c语言程序接口.pdf

    Erlang作为一种专为构建高并发、容错性强的应用程序而设计的语言,在与其他语言(如C语言)的集成方面具有独特的优势。本文将详细介绍Erlang与C语言之间接口的具体实现方式及其工作原理。 #### 二、Erlang与C语言...

    erlang版本的protobuf(erl_protobuffs)

    **protobuf与Erlang** `protobuf`,全称Protocol Buffers,是Google开发的一...通过其优化的编码和解码过程,以及对Erlang特性的良好适应,它在处理大量数据时表现出色,是构建高性能、可扩展的Erlang应用的理想选择。

    rebar工具开发erlang工程项目和发布erlang工程项目

    在Erlang开发中,rebar是一个非常重要的构建工具,它可以帮助我们管理和编译Erlang应用程序,同时支持发布功能。本文以nitrogen_2.0.4框架为例,详细阐述使用rebar进行Erlang项目开发和发布的全过程。 ### 一、环境...

    使用erlang自带的处理日常的xml

    这个是平时工作中使用到的xml处理,使用的是erlang自带的方法加上自已的一个调整使用的,没找到可以选1分的地方

    编写分布式的Erlang程序_陷阱和对策(中文版)

    在编写分布式的Erlang程序时,开发者会遇到各种陷阱和挑战,需要掌握特定的策略来克服。 1. **分布式概念**:Erlang支持跨节点的分布式计算,这意味着程序可以在多个物理或虚拟机上运行。这需要理解如何启动和管理...

    用Erlang写了个解八数码的小程序

    Erlang是一种面向并发的、函数式编程语言,它在处理分布式系统和高并发场景时表现出色。在这个小程序中,Erlang可能利用其并发特性和过程间通信(message passing)来并行地探索解决方案空间,提高解题效率。 描述...

    xiandiao_erlang_Erlang课后习题_

    4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...

    最新版erlang安装包程序下载

    在“最新版erlang安装包程序下载”中,提到的“otp_win64_25.0.1.exe”是一个Windows 64位版本的Erlang OTP(开放电信平台)的安装程序。OTP是Erlang的标准库和框架集合,包含了各种模块和服务,如分布式计算、监控...

    erlang25.0 windows版本

    - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中服务器、事件处理和状态机的通用行为。 - **Elixir**:基于Erlang VM的现代编程语言,提供了更接近Ruby的语法,同时保留了Erlang的并发特性和...

    erlang mysql

    本压缩包文件包含的是 Erlang 连接 MySQL 的源码,这可能是一个 Erlang 驱动程序或应用程序,允许开发者在 Erlang 中编写代码以操作 MySQL 数据库。通常,这样的库会提供接口函数,用于执行 SQL 查询、插入、更新和...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    在聊天室服务器中,如果某个进程因为错误崩溃,Erlang的错误处理机制可以自动重启该进程,保证服务的连续性。 4. 消息传递:Erlang进程间通过消息传递进行通信,这在聊天室服务器中尤为关键。服务器进程会监听来自...

Global site tag (gtag.js) - Google Analytics