自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 Mnesia 数据库学习2

这段代码的重点是qlc:q调用,它会把查询(也就是它的参数)编译成一种用于查询数据库的内部格式。把编译后的查询传递给一个名为do()的函数,它会在接近test_mnesia底部的位置 进行定义,负责运行查询并返回结果。之前我们创建了三个表cost表,shop表,design表,现在我们想为shop表添加或移除行。这里我们可以发现原本orange这里的值被更新了,也就是是在键已经存在的情况下去添加数据,就是跟新这个数据。要移除某一行,需要知道该行的对象ID(Object ID,简称OID)。

2023-09-15 23:28:54 144

原创 Mnesia 数据库学习1

mnesia:create_schema(NodeList)会在NodeList(它必须是一个包含有效Erlang节点的 列表)里的所有节点上都初始化一个新的Mnesia数据库。首先来看Mnesia的查询。事实上,列表推导和SQL之间的高度相似性并不是什么奇怪的事情,因为它们都是基于数学 里的集合论。Mnesia里的表是一个包含若干行的异键或同键表,其中每一行都是一个Erlang记录。在操作数据库之前,需要创建一个数据库架构(schema),启动数据库,添加一些表定义并 停止数据库,然后再重启它。

2023-09-15 00:12:54 175

原创 警报处理器

(3) 安装了一个自定义警报处理器(第2行)。my_alarm_handler的参数(xyz)没什么特殊 含义,只不过语法要求这里有一个值。(4) 设置并清除了一个tooHot警报(第3和第4行)。其中值得注意的方法是 handle_event(Event, State),它应当返回{ok, NewState}。Event是一个{EventType, Event-Arg}形式的元组,其中EventType是set_event或clear_event,而EventArg是一个用户提供的参数。

2023-09-13 23:59:29 105 2

原创 保存元组到磁盘

请注意,每个新添加的文件都会在表里增加两个条目:一个File → Index条目和一个逆向 的Index → Filename条目。这是出于效率的原因。接下来我们将创建一个基于磁盘的表,它将把文件名映射到整数上,反之亦然。为了实现这个索引,我们将创建一个DETS表,然后用三种不同类型的元组填充它。如果文件名在表里,就会返回它的索引,否则就会生成一个新索引并更新表,而 这次更新会使用三个元组。首先编写打开和关闭DETS表的函数,这个表用来保存所有的文件名。当我们在表里输入一个新文件名时,就会指派索引N给它。

2023-09-13 00:34:11 112 1

原创 ETS 表 学习

第二个参数是(反转的)单词, 所以必须在找到\r\n或扫描完字符时把它反转回来 用 ETS 和 DETS 存储数据 默认情况下元组的键就是它的第一个元素。F是一个类型为fun(Str, A) -> A的fun,Str涵 盖了英语里所有的三字母组合,A则是一个累加器。基本上唯一需要使用这个选项的场合是保存Erlang 记录(它其实是元组的另一种形式),并且记录的第一个元素包含记录名的时候。4. protected 创建一个受保护表,任何知道此表标识符的进程都能读取它,但只有主管进程才能写 入它。

2023-09-11 21:27:01 199

原创 Ets学习

同键型的表可以有多个相同的键。副本同键表里允许有多个完全相同的元组,这样 当连续插入两次{a,1}时,表里就会有两个相同的{a,1}元组,而普通同键表里只会留下一个。ETS表看上去像是用Erlang实现的,但事实上它们是在底层的运行时系统里实现的,有着不 同于普通Erlang对象的性能特点。ETS是相当高效的:可以用它存储海量的数据(只要有足够的内存),执行查找的时间也是恒定的(在某些情况下是对数时间)。这个程序会为四种模式各创建一个ETS表,然后向表内插入{a,1}、{b,2}、{a,1}和{a,3}。

2023-09-08 21:19:12 364 1

原创 erlang gen_server之间的通信尝试(2)

就是handle_call/3, Request(gen_server:call/2的第二个参数)作为handle_call/3的第一个参数重新出现。在这种情况下,Reply会返回客户端,成为 gen_server:call的返回值。某个以handle_开头的函数也许会返回一个{stop, Reason, NewState},服务器也可能崩溃并生成{'EXIT', reason}。gen_server模板中的我们通常是用gen_server:call(Name, Request)调用服务器方法。

2023-09-07 23:27:52 258 1

原创 gen_server 之间的通信尝试

在Erlang中,进程通信使用特殊语法 Pid!通过这种方式,一个进程可以向另一个进程发送消息。结果是大量报错,很明显这样写是不行的。

2023-09-06 23:36:21 106 1

原创 gen_server之间的通信

两个gen_server之间的通信可以通过消息传递来实现。可以看到出现了gen_server2给gen_server1返回的消息 Received message ydq。首先,我们需要定义两个gen_server模块,分别为gen_server1和gen_server2。我们先启动gen_server1 然后调用send_msg 方法查看结果。然后我们启动gen_server2 再调用send_msg方法查看结果。可以看到只返回了一个ok。

2023-09-05 23:22:17 93 1

原创 错误记录器

OTP系统自带一个可定制的错误记录器。可以从三个角度看待错误记录器:程序员视角关心 程序员为了记录错误而在代码里中做的函数调用;配置视角关心错误记录器在何处以及如何保存 数据;报告视角关心对已发生错误的分析。

2023-09-04 21:58:17 214 1

原创 gen_server 进程间的通信

发送消息后我们不知道(也不关心)它的命运。现在把注意力转向接收事件消息的进程,它被称为事件处理器。最简单的事件处理器就是一 个“什么都不做”的处理器。当它收到一个{event, X}消息时不会对它做任何处理,只会把它丢弃。要让事件处理器能做点什么,必须编写一个回调模块并把它安装到事件处理器里。E是事件(可以是任意Erlang数据类型),RegProcName是注册进程名。没什么特别的事发生,因为我们还没有给事件处理器安装回调模块。首先要明确一点,事件就是已经发生的事情:是值得注意的。

2023-09-01 23:07:24 93 1

原创 填写 gen_server 模板

编写OTPgen_server大致上就是用你的代码填充一个预制模板,下面是一个例子。前一节分别列出了gen_server的各个区块。例如之前填写gen_server模板获得的my_bank模块。2.往账户存钱(因为没有账户所以返回 not_a_customer )5.取钱(如果超过账户现有的金额那么就会报错)4.现在我们再向账户存钱。模块各个功能测试如下。

2023-08-31 21:33:42 111

原创 gen_server的回调结构下

举个例子,如 果服务器连接到另一个进程并捕捉退出信号,就可能会突然收到一个预料之外的{'EXIT', Pid, What}消息。服务器会因为许多原因而终止。某个以handle_开头的函数也许会返回一个{stop, Reason, NewState},服务器也可能崩溃并生成{'EXIT', reason}。在所有这些情况下,无论它们是怎样发生的,都会调用terminate(Reason, NewState)。如果想让服务器过后重启,就必须编写一个“我胡汉三又回来了”的函数,由terminate/2 触发。

2023-08-31 21:04:09 120

原创 gen_server的回调结构(上)

我们已经见过了gen_server:call和handle_call之间的交互,它的作用是实现远程过程 调用。gen_server:cast(Name, Msg)则实现了一个播发(cast),也就是没有返回值的调用(实 际上就是一个消息,但习惯上称它为播发来与远程过程调用相区分)。gen_server:start_link(Name, Mod, InitArgs, Opts)这个调用是所有事物的起点。它 会创建一个名为Name的通用服务器,回调模块是Mod,Opts则控制通用服务器的行为。

2023-08-30 19:34:02 138

原创 gen_server 入门

以下三点是编写gen_server回调模块的简要步骤。(1) 确定回调模块名。(2) 编写接口函数。(3) 在回调模块里编写六个必需的回调函数。按部就班,我们将编写一个简单的支付系统。把这个模块称为my_bank。

2023-08-29 20:55:48 159 1

原创 Erlang/OTP学习,阶段性总结

现在我们将重新构建四个服务器 server1,server2,server3,server4,作为在学习gen server之前的前置小项目,他们每一个都和前面有小小的不同,server4会类似于Erlang分发套装里的gen server。

2023-08-28 21:28:20 216 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除