热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Erlang中的可变数据结构

如何解决《Erlang中的可变数据结构》经验,为你挑选了1个好方法。

我是功能方法的新手.为了我的学习,我选择了两种函数式语言,Erlang和Clojure.我正在尝试编写简单的套接字服务器,它能够存储有关当前连接的信息.

例如,如果socket1想要向socket2发送消息,它应该发送到服务器:

对socket2的"消息".

或者它可以是JSON.消息格式现在无关紧要.

使用Clojure我发现了一些可变数据结构,如Agent.在Clojure的情况下,我使用Agent作为可变数组,我存储所有当前连接.但我在Erlang中找不到类似的东西.你能帮帮我吗?

我搜索了我的问题,但我发现Erlang中没有可变数据结构.在这种情况下,我可以存储所有当前连接?

谢谢.



1> 小智..:

在你深入ets表之前,值得花些时间自己实现像ets表这样的东西.我们的想法是您启动一个流程,此流程的状态就是您存储的数据.

下面是一个存储单元类型的进程的简单示例,它可以无限期地保留一个值,并允许用户覆盖此值.这可以很容易地扩展到在状态中保存字典,允许键+值操作.

-module(simple_storage_cell).
-export([start/0, get/1, put/2]).

start() ->
    spawn_link(fun() -> loop([]) end).

get(Pid) ->
    Pid ! {get, self()}, %% the self() here gets the pid of the 
                         %% calling process, not the storage cell
    receive {retrieved, Val} -> Val
    after 500 -> error(timeout)
    end.

put(Pid, Val) ->
    Pid ! {put, self(), Val}, %% see above, in get/1
    receive {saved, Val} -> Val
    after 500 -> error(timeout)
    end.


loop(StoredItem) ->
    receive
        {get, RequestingPid} ->
            RequestingPid ! {retrieved, StoredItem},
            %% we now 'hold' the StoredItem in the cell
            loop(StoredItem);
        {put, RequestingPid, NewValue} ->
            RequestingPid ! {saved, NewValue},
            %% we lose the old value, keeping NewValue in the cell
            loop(NewValue);
        OtherMsg -> error({unexpected_msg, OtherMsg})
    end.

这会给您以下行为:

1> Cell = simple_storage_cell:start().
<0.33.0>
2> simple_storage_cell:get(Cell).
[]
3> simple_storage_cell:put(Cell, "hello").
"hello"
4> simple_storage_cell:get(Cell).
"hello"
5> simple_storage_cell:get(Cell).
"hello"
6> simple_storage_cell:put(Cell, "new value").
"new value"
7> simple_storage_cell:get(Cell).
"new value"

请注意,这种编程实质上是将全局状态重新引入(名义上)无状态系统.如果你有两个进程get并将put值绑定到一个单元格中,那么你刚刚引入了资源争用,并且失去了函数式编程应该给你的许多好处.

如果我可以添加个人注释:选择一种具有严格打字规则的second语言作为您的功能语言会更明智.而不是学习Clojure + Erlang,我建议组合如:(Clojure,Scala),(Erlang,Haskell),(Scheme,*ML)更有可能丰富你的智力工具箱.


推荐阅读
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文记录了 JavaScript 中正则表达式的使用方法和常见操作,包括匹配、替换、搜索等。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
author-avatar
丫头丫头520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有