2010-08-16 116 views
6

好吧,我一直在想方设法弄清楚这一点。Erlang - 全局变量..是我知道,我知道

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

所以,我试图创建一个新表,然后寻找它:

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

然后我用:

get({tableUniqueID}) 

而且在同一个函数返回表格ID就好了......然而,当我在另一个函数中使用它,它返回一个未定义的。

什么?我想获取和放置了一个重要的全球性..

之前也这一切我认识你“可以”调用表查找功能,例如:

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

同样的事情,在功能上的作品,外面不..获取把问题..

然后我意识到另一种方式来查找表是通过调用表

ets:lookup(tb, msgIn) 

的原子但是这永远不会奏效,不会在函数内部,不出..

所以我的主要优先事项是要找出为什么查找一个表的原子,是不可能的。但它说这是最无处不在,包括手册。

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

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

回答

6

我知道了!!

祝文档,会说这查询功能下.. 更重要的是,大家谁对ETS写教程,以上这样的书

的解决方案是

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

这named_table是的重要组成部分

通过一些手册页挖,但

;)

4

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

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