2011-05-02 60 views
2

我目前正在製作遊戲服務器的項目中。每個玩家都應該擁有一個擁有gen_fsm行爲的進程。要用start/3啓動gen_fsm,我們需要一個獨特的原子,目前我們使用make_ref()並找到了一種方法,使ref可以通過ref_to_list/1使這個ref成爲一個原子。但根據this post它不建議,我同意他。gen_fsm的獨特原子:Erlang的start/3

你會如何解決這個問題?當我們用本地選項啓動一個gen_fsm時,我們需要一個原子來識別它。

回答

8

如果您使用gen_fsm:start/3,您需要的唯一原子就是回調模塊名稱。這樣你只需要跟蹤一個PID(進程ID),該PID將自動是唯一的。

如果您稍後需要到達gen_fsm進程,請將PID保存在某種映射表中或命名進程(如您所做的那樣)。

+1

謝謝,我錯過了使用gen_fsm:send_event/2時FsmRef也可能是Pid的事實,我以爲我需要一個原子......想起它,這沒有任何意義。 – softarn 2011-05-03 09:06:48

0

您應該看到gproc(https://github.com/esl/gproc)創建進程註冊表以將某個erlang術語與進程的pid()相關聯。將每個啓動的gen_fsm進程註冊爲獨特的原子並不是一個好主意。

2

也許我錯過了一些東西,但它聽起來像你最好的行動方式是不指定local選項,即不給gen_fsm過程一個名字。

值得注意的是,erlang vm的一個實例可以使用limit to the number of unique atoms。因此產生大量的隨機原子可能是一個壞主意。

+2

這絕對是一個壞主意! – rvirding 2011-05-02 14:21:47