2012-03-06 76 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

相關問題