2012-03-06 79 views

回答

1

AFAIK没有办法在erlang节点之间传输一个进程,我可以考虑很多原因来禁止这种情况,其他人可能会混淆内部节点内存,只考虑一个持有数据的进程(内部除外'State'循环参数)在进程字典(进程堆),二进制(不同的垃圾回收方法)中。

一种解决方法可能是为gen_fsm/gen_server提供一种方法,该方法可以产生一个新的进程,同时重新创建服务器/状态机的内部状态。 我认为这是比较困难的说实现,你可以简单地使用两种启动功能:

  • 一个初始化的行为(就像我认为你现在做的)
  • 一个需要也节点,并通过远程方法开始调用该节点上的服务器,并初始化状态(由init/1函数或在通过发送消息的explicite方式,即,服务器的状态)

但我必须说,我在这里看到两个主要问题:

  • 同步:一个需要确保过程:远程节点上启动服务器 - >设置远程服务器状态 - >杀当前本地服务器是原子
  • 连贯性:参照本地一个其他进程必须将他们的参考切换到远程一个

前者可以在很多方面(我的两分钱:显式消息的本地和远程服务器之间传递 - 开销,但防弹考虑Erlang运行时系统)来解决,后者可以利用监视器/链接和退出的回报来解决值(远程服务器pid),或者使用带gen_event进程的发布/订阅模型更优雅。

我希望你发现这个有用的解决你的问题,并要求任何事情,如果你需要!

+0

嗨,谢谢你的回复。实际上,我只需要将gen_fsm移动到不同的节点来维护其状态。它也应该从节点A的主管中删除自己,并将其自身添加到节点B上的主管。这给我带来一些麻烦,因为在很短的时间内它不会受到监督,我猜... – user601836 2012-03-06 16:47:35

+0

你的主管策略是什么?如果它是一对一的,你可以在没有问题的情况下删除并向树添加进程。关于流程未被监督的流逝,这就是我上面提到的'原子'操作。当且仅当迁移过程已成功完成时,您可以拥有一个侦听这两个进程并终止本地进程的过程,但您应该考虑可能的状态更改(您必须绝对遵守!)。 – 2012-03-06 16:57:38

+0

1)是的,一对一2)我能想到的最简单的解决方案是,新生成的gen_fsm在注册到主管之后将发送呼叫到原始呼叫。该调用将触发第一个实例以正常方式退出 – user601836 2012-03-06 17:05:03

相关问题