5

我有一个设置,我有四个正在运行的服务器实例,每个服务器框有两个实例。我的服务器涉及大量传递匿名函数并在不同的线程上运行它们(可能在不同的服务器上)。

今天我重新加载了代码,其中涉及更改其中一个实例上的一些静态函数的内容(计划按顺序执行每个实例)。在运行我的重新加载时,我遇到了大量的badfun错误。那个盒子上的另一个实例也开始吐出类似的错误。另一个盒子上的两个实例我们似乎没有受到影响。

我发现这篇文章: http ://www.javalimit.com/2010/05/passing-funs-to-other-erlang-nodes.html 这似乎暗示这些错误的原因是匿名函数有不同的版本在两个节点之间,因此它坏了。但是,在测试中我无法重现此错误。此外,我之前已经多次重新加载代码而没有看到类似的内容。然而,这是我第一次为每个盒子重新加载两个实例(以前是每个盒子一个实例)。有没有人知道为什么会发生这种情况,以及如何防止它(不杀死所有东西并重新启动它,这是我必须做的)。

4

1 回答 1

3

为了识别 funs,erlang vm 对代码进行哈希处理并将其合并到 fun 标识符中。正是这个标识符被发送到另一个节点,当尝试在远程端访问那个乐趣时,它找不到那个哈希的乐趣。

要查看实际情况,请获取一段带有匿名 fun 的代码并将其加载到一个 vm 中,然后编辑 fun 并将新代码加载到单独的 vm 中。然后尝试将原来的乐趣发送到第二个vm并执行它。

于 2012-10-24T08:02:19.290 回答