- 博客(34)
- 资源 (2)
- 收藏
- 关注
原创 MIX & OTP——依赖项和总体项目
在本章中,我们学习了更多关于 Mix 依赖项和umbrella project的知识。虽然我们可以在没有服务器的情况下运行 kv,但我们的 kv_server 直接依赖于 kv。通过将它们分解为单独的应用程序,我们可以更好地控制它们的开发和测试方式。使用umbrella application时,在它们之间划出明确的界限非常重要。我们即将推出的 kv_server 必须仅访问 kv 中定义的公共 API。
2024-07-02 17:50:54
780
原创 MIX & OTP——使用 ETS 加速
每次我们需要查找存储容器时,我们都需要向注册表发送一条消息。如果我们的注册表被多个进程同时访问,注册表可能会成为瓶颈!在本章中,我们将了解 ETS(Erlang Term Storage)以及如何将其用作缓存机制。
2024-07-02 16:22:42
562
原创 MIX & OTP——监督动态子进程
现在,我们已经成功定义了我们的监督器,它将作为应用程序生命周期的一部分自动启动(和停止)。但请记住,我们的 KV.Registry 在 handle_cast/2 回调中同时链接(通过 start_link)和监控(通过 monitor)存储容器进程:链接是双向的,这意味着存储容器崩溃会导致注册表崩溃。虽然我们现在有了监督进程,可以保证注册表恢复正常运行,但注册表崩溃仍然意味着我们会丢失将存储容器名称与其各自进程相关联的所有数据。换句话说,我们希望即使存储容器崩溃,注册表也能继续运行。
2024-06-28 17:28:36
1026
原创 MIX & OTP——监督树和应用
在上一章关于 GenServer 的内容中,我们实现了 KV.Registry 来管理存储容器。在某个时候,我们开始监控存储容器,这样每当 KV.Bucket 崩溃时,我们就能采取行动。虽然变化相对较小,但它提出了一个 Elixir 开发人员经常问的问题:当出现故障时会发生什么?在我们添加监控之前,如果存储容器崩溃,注册表将永远指向不再存在的存储容器。如果用户尝试读取或写入崩溃的存储容器,它将失败。任何尝试创建具有相同名称的新存储容器的操作都只会返回崩溃存储容器的 PID。
2024-06-28 16:49:46
810
原创 MIX & OTP——使用 GenServer 进行客户端-服务器通信
在上一章中,我们使用代理来表示存储容器。在 mix 的介绍中,我们指定要命名每个存储容器,以便我们可以执行以下操作:在上面的会话中,我们与“购物”存储容器进行了交互。由于代理是进程,因此每个存储容器都有一个进程标识符 (PID),但存储容器没有名称。在“进程”一章中,我们了解到可以通过为进程赋予原子名称来在 Elixir 中注册进程:但是,用原子命名动态进程是一个糟糕的想法!如果我们使用原子,我们需要将存储容器名称(通常从外部客户端接收)转换为原子,并且我们永远不应该将用户输入转换为原子。
2024-06-26 17:04:16
1743
原创 MIX & OTP——通过代理进行简单的状态管理
在本章中,我们将学习如何在多个实体之间保持和共享状态。如果您以前有过编程经验,您可能会想到全局共享变量,但我们将在这里学习的模型完全不同。下一章将概括这里介绍的概念。如果您跳过了入门指南或很久以前读过它,请务必重新阅读流程章节。我们将使用它作为起点。
2024-06-22 16:08:33
815
原创 MIX & OTP——Mix 简介
在本指南中,我们将构建一个完整的 Elixir 应用程序,它具有自己的监督树、配置、测试等。本指南的要求如下(请参阅 elixir -v):Elixir 1.15.0 及以上版本Erlang/OTP 24 及以上版本该应用程序用作分布式键值存储。我们将把键值对组织到存储桶中,并将这些存储桶分布在多个节点上。我们还将构建一个简单的客户端,允许我们连接到任何这些节点并发送请求,例如:为了构建我们的键值应用程序,我们将使用三个主要工具:1.OTP(开放电信平台)是 Erlang 附带的一组库。
2024-06-22 11:37:07
591
原创 Elixir学习笔记——Erlang 库
Elixir 提供了与 Erlang 库的出色互操作性。事实上,Elixir 不鼓励简单地包装 Erlang 库,而是直接与 Erlang 代码交互。在本节中,我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。Erlang 模块的命名约定与 Elixir 不同,并且以小写字母开头。在这两种情况下,模块名称都是原子,我们通过分派到模块名称来调用函数:随着您对 Elixir 的熟练程度不断提高,您可能希望更详细地探索 Erlang STDLIB 参考手册。
2024-06-17 17:51:21
1031
原创 Elixir学习笔记——可选语法表
在前面的章节中,我们了解到 Elixir 语法允许开发人员在一些情况下省略分隔符,以使代码更具可读性。例如,我们了解到括号是可选的:并且 do-end 块相当于关键字列表:关键字列表使用 Elixir 的常规符号来分隔参数,其中我们用逗号分隔每个键值对,每个键后面跟着 :。在 do 块中,我们去掉了冒号和逗号,并用换行符分隔每个关键字。它们非常有用,因为它们在编写代码块时消除了冗长。大多数时候,我们使用块语法,但知道它们是等效的会很好。
2024-06-17 17:32:56
337
原创 Elixir学习笔记——编写文档
Elixir 将文档视为一等级别类。文档必须易于编写且易于阅读。在本指南中,您将学习如何在 Elixir 中编写文档,涵盖模块属性、样式实践和文档测试等结构。
2024-06-17 17:23:43
658
原创 Elixir学习笔记——try, catch, and rescue
Elixir 有三种错误机制:errors, throws, and exits。在本章中,我们将探索每种机制,并说明何时应使用它们。
2024-06-17 17:00:34
820
原创 Elixir学习笔记——自定义符号
正如本章开头所暗示的,Elixir 中的符号是可扩展的。事实上,使用符号 ~r/foo/i 相当于使用二进制和字符列表作为参数调用 sigil_r:我们可以通过 sigil_r 访问 ~r 符号的文档:我们还可以通过实现遵循 sigil_{character} 模式的函数来提供我们自己的符号。例如,让我们实现返回整数的 ~i 符号(使用可选的 n 修饰符使其为负数):自定义符号可以是单个小写字符,也可以是大写字符后跟更多大写字符和数字。符号还可以在宏的帮助下用于执行编译时工作。
2024-06-17 16:37:38
636
原创 Elixir学习笔记——速构(函数式编程基础)
在 Elixir 中,循环遍历 Enumerable 是很常见的,通常会过滤掉一些结果并将值映射到另一个列表中。速构是此类构造的语法糖:它们将这些常见任务分组为 for 特殊形式。例如,我们可以将一串整数映射到它们的平方值:速构由三部分组成:生成器、过滤器和可收集物。
2024-06-17 16:07:36
275
原创 Elixir学习笔记——协议
协议是一种在 Elixir 中实现多态性的机制,您希望行为根据数据类型而变化。我们已经熟悉解决此类问题的一种方法:通过模式匹配和保护子句。考虑一个简单的实用程序模块,它会告诉我们输入变量的类型:如果此模块的使用仅限于您自己的项目,您将能够继续为每种新数据类型定义新的 type/1 函数。但是,如果此代码作为依赖项由多个应用程序共享,则可能会出现问题,因为没有简单的方法来扩展其功能。这就是协议可以帮助我们的地方:协议允许我们根据需要扩展尽可能多的数据类型的原始行为。
2024-06-17 15:17:41
509
原创 Elixir学习笔记——结构
要定义结构,请使用 defstruct/1 构造:defstruct 使用的关键字列表定义了结构将具有哪些字段及其默认值。结构采用其定义模块的名称。在上面的示例中,我们定义了一个名为 User 的结构。
2024-06-17 14:09:21
533
原创 Elixir学习笔记——模块属性
Elixir 中的模块属性有三个用途:1.作为模块和函数注释2.作为编译期间使用的临时模块存储3.作为编译时常量让我们检查一下这些示例。
2024-06-15 17:46:39
553
原创 Elixir学习笔记——别名、需要、导入和使用
为了便于软件重用,Elixir 提供了三个指令(alias、require 和 import)以及一个名为 use 的宏,总结如下:# 为模块添加别名,以便可以将其称为 Bar 而不是 Foo.Bar# 需要模块才能使用其宏# 从 Foo 导入函数,以便可以在不带 `Foo.` 前缀的情况下调用它们import Foo# 调用 Foo 中定义的自定义代码作为扩展点use Foo我们现在将详细探讨它们。
2024-06-15 17:27:35
730
原创 Elixir学习笔记——输入输出和文件系统
本章介绍输入/输出机制、文件系统相关任务以及相关模块(如 IO、File 和 Path)。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。
2024-06-15 16:50:49
547
原创 Elixir学习笔记——进程(Processes)
在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU 方面非常轻量级(甚至与许多其他编程语言中使用的线程相比也是如此)。因此,同时运行数万甚至数十万个进程并不罕见。在本章中,我们将学习生成新进程的基本构造,以及在进程之间发送和接收消息。
2024-06-14 18:22:52
883
原创 Elixir学习笔记——可枚举和流
虽然 Elixir 允许我们编写递归代码,但我们对集合执行的大多数操作都是在 Enum 和 Stream 模块的帮助下完成的。让我们学习如何操作。Elixir 提供了可枚举的概念以及与之配合使用的 Enum 模块。我们已经学习了两种可枚举:列表和映射。[2, 4, 6][2, 12]Enum 模块提供了大量函数来转换、排序、分组、过滤和检索可枚举中的项目。它是开发人员在 Elixir 代码中经常使用的模块之一。有关 Enum 模块中所有函数的一般概述,请参阅 Enum 备忘单。
2024-06-14 16:53:31
638
原创 Elixir学习笔记——模块和函数
在模块内部,我们可以使用 def/2 定义函数,使用 defp/2 定义私有函数。使用 def/2 定义的函数可以从其他模块调用,而私有函数只能在本地调用。enda + bendend函数声明还支持保护和多个子句。如果函数有多个子句,Elixir 将尝试每个子句,直到找到匹配的子句。以下是检查给定数字是否为零的函数的实现:def zero?后面的问号表示此函数返回布尔值。
2024-06-05 11:58:42
931
原创 Elixir学习笔记——关键字列表和映射
在上一节中,我们将映射用作键值数据结构,其中可以随时添加或删除键。但是,使用预定义键集创建映射也很常见。它们的值可能会更新,但永远不会添加或删除新键。当我们知道正在处理的数据的形状时,这很有用,如果我们得到不同的键,则很可能意味着其他地方犯了错误。我们使用与上一节相同的语法定义此类映射,但所有键都必须是原子:从上面的打印结果可以看出,Elixir 还允许您使用与关键字列表相同的 key: value 语法编写原子键的映射。
2024-06-05 11:33:54
668
原创 Elixir学习笔记——二进制、字符串和字符列表
在“基本类型”中,我们学习了一些关于字符串的知识,并使用 is_binary/1 函数进行检查:"hello"true在本章中,我们将明确二进制到底是什么、它们与字符串的关系以及 Elixir 中单引号值“like this”的含义。虽然字符串是计算机语言中最常见的数据类型之一,但它们却非常复杂,经常被误解。要理解 Elixir 中的字符串,我们必须了解 Unicode 和字符编码,特别是 UTF-8 编码。
2024-06-04 20:26:31
786
原创 Elixir学习笔记——匿名函数
Elixir 中的匿名函数由关键字 fn 和 end 分隔:3true在上面的例子中,我们定义了一个匿名函数,它接收两个参数 a 和 b,并返回 a + b 的结果。参数始终位于 -> 的左侧,而要执行的代码位于右侧。匿名函数存储在变量 add 中。我们可以通过向其传递参数来调用匿名函数。请注意,调用匿名函数需要在变量和括号之间有一个点 (.)。当您调用存储在变量 add 中的匿名函数时,点会使其清晰,而不是调用名为 add/2 的函数。
2024-06-04 19:48:30
1078
原创 Elixir学习笔记——模式匹配
在本章中,我们将了解 Elixir 中 = 运算符为何称为匹配运算符,以及如何使用它在数据结构中进行模式匹配。我们将了解用于访问先前绑定的值的固定运算符 ^。
2024-06-04 19:08:20
698
原创 Elixir学习笔记——基本类型
在本章中,我们将学习更多关于 Elixir 基本类型:整数、浮点数、布尔值、原子和字符串。其他数据类型,如列表和元组,将在下一章中探讨。
2024-06-04 18:35:56
866
原创 Elixir学习笔记——第一章
现在,让我们先运行 iex(如果您使用的是 Windows PowerShell,则运行 iex.bat,其中 iex 是 PowerShell 命令),它代表 Interactive Elixir。注意:如果您使用的是 Windows 并且运行的是 Erlang/OTP 26 之前的版本,您还可以尝试 iex --werl(PowerShell 上的 iex.bat --werl),这可能会提供更好的体验,具体取决于您使用的控制台。请注意,您的会话中的某些细节(例如版本号)可能会略有不同,但这并不重要。
2024-06-04 17:56:22
576
转载 Laya性能优化精选内容整理
第一是性能统计工具,这是LayaAir引擎内置的性能统计工具,在代码加入Laya.Stat.show();引擎内置的性能统计工具打开这个工具后,可以用于观察性能,除了FPS越高越好外,其它的值越低越好。这里尤其要关注DrawCall数量,这是重要的优化指标,尽量要控制在100以下。第二是DebugPanel调试工具,这也是LayaAir引擎自带的调试工具,类似DIV调试窗口,可审查...
2018-12-08 23:52:36
5741
转载 一些值得学习的Unity教程 (很实用的包括源码)
*****************************Git开源项目*******************************1.https://git.oschina.net/dingxiaowei/TANKS.git2.SCUT https://github.com/ScutGame/Scut/wiki3.TTUIFramework https://github.com/chiuan...
2018-02-12 16:42:32
7989
1
转载 【转】 值得推荐的C/C++框架和库 (真的很强大)
值得学习的C语言开源项目- 1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:http://home.tiscali.cz/~cz210552/...
2018-02-11 10:18:08
441
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人