Erlang - Global Variables ..是的,我知道,我知道

时间:2010-08-16 04:03:03

标签: erlang global

好的,我一直在尝试各种方法来解决这个问题。

我需要让这个表成为一个全局的...我已经意识到在我的程序范围内传递TableID的效率要低得多。

所以我尝试创建一个新表然后查找它:

TableID = ets:new(tb, [set,public]),
put({tableUniqueID}, TableID),

然后我用了:

get({tableUniqueID})

在同一个函数中,它返回TableID就好......但是当我在另一个函数中使用它时,它返回一个未定义的。

什么?我认为得到并把它变成了一个关键的全局......

在此之前我意识到你“可以”调用表查找函数:

ets:lookup(get({tableUniqueID}), msgIn)

同样的事情,在功能工作中,外面没有..得到问题..

然后我意识到查找表的另一种方法是调用表的原子

ets:lookup(tb, msgIn)

但是这绝不会有效,不是在功能内部,不是出来..

所以我的主要优先事项是弄清楚为什么用原子查找表是不可能的。但它表示它无处不在,包括手册。

get / put我可以没有,只要我可以存储表,然后通过其原子标识符查找表。

任何人都可以解释这个困境吗?

3 个答案:

答案 0 :(得分:6)

我知道!!

希望文档,会在查找函数下说这个.. 更好的是,所有在ets上编写教程的人,或更多的书籍

解决方案是

TableID = ets:new(tb, [set,public,named_table])

named_table是重要的部分

有些人在挖掘手册页,但是

答案 1 :(得分:5)

问题的正确答案是根本不使用全局表,而是传递信息。特别是因为你在原始问题中提到了效率。您正在代码中创建拥塞点,这将使其在任何多核计算机上的性能都会下降。

ets表实现为所有其他进程必须调用以获取值的进程。

答案 2 :(得分:0)

自Erlang 21.2起,有一个实现“ globals”的新的读取优化版本。看一下模块persistent_term

persistent_term:put(Key, Value)

这对于仅写入一次的全局标志非常有用,例如只是在启动时,但在不同的过程中要花费很多时间。所有进程都具有对这些全局变量的快速读取访问权限:

Value = persistent_term:get(Key)