1
我想知道從erlang節點A向erlang節點B移動gen_server/gen_fsm以保持其內部狀態的建議方式(如果有)。如何將gen_server/gen_fsm從節點轉移到節點
我想知道從erlang節點A向erlang節點B移動gen_server/gen_fsm以保持其內部狀態的建議方式(如果有)。如何將gen_server/gen_fsm從節點轉移到節點
AFAIK沒有辦法在erlang節點之間傳輸一個進程,我可以考慮很多原因來禁止這種情況,其他人可能會混淆內部節點內存,只考慮一個持有數據的進程(內部除外'State'循環參數)在進程字典(進程堆),二進制(不同的垃圾回收方法)中。
一種解決方法可能是爲gen_fsm/gen_server提供一種方法,該方法可以產生一個新的進程,同時重新創建服務器/狀態機的內部狀態。 我認爲這是比較困難的說實現,你可以簡單地使用兩種啓動功能:
但我必須說,我在這裏看到兩個主要問題:
前者可以在很多方面(我的兩分錢:顯式消息的本地和遠程服務器之間傳遞 - 開銷,但防彈考慮Erlang運行時系統)來解決,後者可以利用監視器/鏈接和退出的回報來解決值(遠程服務器pid),或者使用帶gen_event進程的發佈/訂閱模型更優雅。
我希望你發現這個有用的解決你的問題,並要求任何事情,如果你需要!
嗨,謝謝你的回覆。實際上,我只需要將gen_fsm移動到不同的節點來維護其狀態。它也應該從節點A的主管中刪除自己,並將其自身添加到節點B上的主管。這給我帶來一些麻煩,因爲在很短的時間內它不會受到監督,我猜... – user601836 2012-03-06 16:47:35
你的主管策略是什麼?如果它是一對一的,你可以在沒有問題的情況下刪除並向樹添加進程。關於流程未被監督的流逝,這就是我上面提到的'原子'操作。當且僅當遷移過程已成功完成時,您可以擁有一個偵聽這兩個進程並終止本地進程的過程,但您應該考慮可能的狀態更改(您必須絕對遵守!)。 – 2012-03-06 16:57:38
1)是的,一對一2)我能想到的最簡單的解決方案是,新生成的gen_fsm在註冊到主管之後將發送呼叫到原始呼叫。該調用將觸發第一個實例以正常方式退出 – user601836 2012-03-06 17:05:03