Erlang支持一种方式,就是用C来实现函数,并在Erlang中透明地使用它们。这些函数被叫做NIFs(原生实现的函数)。在两种场景下,NIF被证明是完美的解决方案:当你需要原始的计算速度时;当你需要从Erlang调用已有的C接口时。在本文中,我们一起来看看这两种场景。
使用“with”宏更好地控制执行流程
从Elixir1.2开始就可以用with宏来写出更有表现力的流程控制语句。与需要深度嵌套的 case 和 if/else 语句不同,你可以只使用一个 with 语句来表达一样的逻辑,而且方式上更加优雅可读性也更好。下面我将探索如何利用它们来改进你的代码。
with 的基础
with 后跟一个句子列表,这些句子将按顺序执行。如果所有句子的结果都是正常,那么 do 后面的语句将被执行。当其中一个句子的结果有问题,则 do 后面的句子就不执行,而且相关错误值将返回给调用者。
|
|
Erlang的宏
Erlang里的文件包含
Erlang中包含文件的语法有两个:
- -include(File).
- -include_lib(File).
它们其实是预编译指令。其中File是一个字符串,表示被包含文件的文件名相对路径或绝对路径。
在Erlang中,一般需要被公用的记录和宏定义都放在被包含文件里,文件名后缀名为.hrl。
File可以使用操作系统的环境变量作为路径开头部分。比如:
-include(“\$PROJ_ROOT/my_records.hrl”).
Erlang将使用os:getenv(PROJ_ROOT)来获得操作系统的环境变量PROJ_ROOT的值,并替换”\$PROJ_ROOT/my_records.hrl”中的\$PROJ_ROOT。
如果File是绝对路径,则Erlang就按绝对路径来查找文件。如果File不是绝对路径,则Erlang按如下顺序来查找文件:
- 当前工作目录
- 编译后的模块所在目录
- 通过include选项给出的目录
include_lib不指定绝对路径。路径的第一部分被Erlang虚拟机认为是一个应用的名字。例如:
-include_lib(“kernel/include/file.hrl”).
Erlang使用code:lib_dir(kernel)来获得kernel应用的绝对路径,然后替换”kernel/include/file.hrl”里的kernel,最后得到绝对路径。
Erlang的调度器如何绑定到CPU
调度器绑定CPU
在启动Erlang虚拟机的时候可以通过参数来设置它的调度器以什么方式绑定CPU。这个参数是 +sbt,也可以用另一个参数 +stbt。它们的使用方法是:
+sbt 绑定类型
例如:
|
|
这两个参数的差异表现在对如下错误的处理方式上:
- 某些不支持绑定CPU功能的平台上尝试绑定调度器到CPU
- 没有可用的CPU拓扑。运行时系统无法自动侦测到CPU拓扑,并且我们也没有设置自定义的CPU拓扑。
当发生上述两种情况的时候,如果使用的是 +sbt 参数,则运行时系统会打印错误消息并拒绝启动;而如果使用的是 +stbt 参数,则运行时系统会忽略错误,并且用调度器不绑定CPU的方式启动。
勉励自己
世界上任何书籍都不能带给你好运,
但是它们能让你悄悄成为你自己。
我继续和时间做朋友。
简说MQTT--第三部分:会话、服务质量和保留消息
有时候,我们希望MQTT代理会在客户端断开连接时存储客户端的订阅和队列消息,并在客户端稍后重新联机的时候将这些消息传递给它。在MQTT的世界中,存在保留消息,QoS级别和清除会话等技术,这些都对客户端存储消息有所影响。 我们将在这篇短文中讨论它们。
关于变量绑定的棘手问题
在我的工作中,我有个任务是为Erlang程序员应聘者设计一套选择题考卷,我决定包含一个关于变量绑定的棘手问题。在加入这个问题之前,我决定自己先尝试一下(你懂的……我这是为了预防万一)并且我发现了一些可能让你第一眼看到觉得很惊讶的事情,尽管这在事后是很明显的。
简说MQTT--第二部分:MQTT是如何运作的?
与传统的客户端/服务器协议不同,MQTT不是端到端的。MQTT是一种发布订阅消息交换协议。另外,与消息队列不同,MQTT不维护任何队列。它使用主题来路由消息。
这次我们将向你展示MQTT是如何运作的。
简说MQTT--第一部分:MQTT是啥?
MQTT是什么?这个问题的最贴切的答案是我在网站mqtt.org看到的:
“MQTT是机器对机器(M2M)/物联网的链接协议。”
它解释得十分清楚,MQTT是M2M和物联网(IoT)连接协议。要理解MQTT,我们需要首先去了解M2M或物联网。