好的,我一直在尝试各种方法来解决这个问题。
我需要让这个表成为一个全局的...我已经意识到在我的程序范围内传递TableID的效率要低得多。
所以我尝试创建一个新表然后查找它:
TableID = ets:new(tb, [set,public]),
put({tableUniqueID}, TableID),
然后我用了:
get({tableUniqueID})
在同一个函数中,它返回TableID就好......但是当我在另一个函数中使用它时,它返回一个未定义的。
什么?我认为得到并把它变成了一个关键的全局......
在此之前我意识到你“可以”调用表查找函数:
ets:lookup(get({tableUniqueID}), msgIn)
同样的事情,在功能工作中,外面没有..得到问题..
然后我意识到查找表的另一种方法是调用表的原子
ets:lookup(tb, msgIn)
但是这绝不会有效,不是在功能内部,不是出来..
所以我的主要优先事项是弄清楚为什么用原子查找表是不可能的。但它表示它无处不在,包括手册。
get / put我可以没有,只要我可以存储表,然后通过其原子标识符查找表。
任何人都可以解释这个困境吗?
答案 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)