好的,我一直在尝试各种方法来解决这个问题.
我需要让这个表成为一个全局的...我已经意识到在我的程序范围内传递TableID的效率要低得多.
所以我尝试创建一个新表然后查找它:
TableID = ets:new(tb, [set,public]),
put({tableUniqueID}, TableID),
Run Code Online (Sandbox Code Playgroud)
然后我用了:
get({tableUniqueID})
Run Code Online (Sandbox Code Playgroud)
并且在同一个函数中它返回TableID就好......但是当我在另一个函数中使用它时,它返回一个未定义的.
什么??我认为得到并把它作为一个关键的全球..
在此之前,我意识到你"可以"调用表查找函数:
ets:lookup(get({tableUniqueID}), msgIn)
Run Code Online (Sandbox Code Playgroud)
同样的事情,在功能工作,外面没有..得到问题..
然后我意识到查找表的另一种方法是调用表的原子
ets:lookup(tb, msgIn)
Run Code Online (Sandbox Code Playgroud)
但这永远不会工作,不是在功能内部,不是...
所以我的主要优先事项是弄清楚为什么用原子查找表是不可能的.但它表示它无处不在,包括手册.
get/put我可以没有,只要我可以存储表,然后通过其原子标识符查找表.
任何人都可以解释这个困境吗?
我知道了!!
希望文档,会在查找函数下说这个..更好的是,每个人都在ets上写教程,或者更多的是如此书籍
解决方案是
TableID = ets:new(tb, [set,public,named_table])
Run Code Online (Sandbox Code Playgroud)
named_table是重要的部分
有些人在挖掘手册页,但是
;)
问题的正确答案是根本不使用全局表,而是传递信息.特别是因为你在原始问题中提到了效率.您正在代码中创建拥塞点,这将使其在任何多核计算机上的性能更差.
ets表实现为所有其他进程必须调用以获取值的进程.
| 归档时间: |
|
| 查看次数: |
4443 次 |
| 最近记录: |