2011-05-02 7 views
2

현재 게임 서버를 만드는 프로젝트에 있습니다. 모든 플레이어는 gen_fsm 동작을 사용하는 자체 프로세스가 있다고 가정합니다. gen_fsm을 시작/3으로 시작하려면 고유 한 원자가 필요합니다. 현재는 make_ref()를 사용하여이 ref를 ref_to_list/1이있는 원자로 만드는 방법을 발견했습니다. 그러나 this post에 따르면 추천하지 않으며 나는 그에 동의한다.gen_fsm의 고유 원자 : 얼랑의 start/3

이 문제를 어떻게 해결하겠습니까? local 옵션을 사용하여 gen_fsm을 시작할 때이를 식별 할 수있는 원자가 필요합니다.

답변

8

gen_fsm:start/3을 사용하는 경우 콜백 모듈 이름 만 필요합니다. 그렇게하면 자동으로 고유 한 PID (프로세스 ID) 만 추적하면됩니다.

나중에 gen_fsm 프로세스에 도달해야하는 경우 PID를 일종의 매핑 테이블에 저장하거나 프로세스 이름을 지정하십시오.

+1

감사합니다. 나는 gen_fsm : send_event/2를 사용할 때 FsmRef가 Pid 일 수도 있다는 사실을 놓쳤습니다. 나는 원자를 필요로한다고 생각했습니다. 생각해 보면 이해가되지 않을 것입니다. – softarn

0

프로세스의 pid()에 몇 가지 용어를 연결하는 프로세스 레지스트리를 작성하려면 gproc (https://github.com/esl/gproc)가 표시되어야합니다. 고유 한 원자로 시작된 각 gen_fsm 프로세스를 등록하는 것은 좋지 않습니다.

2

아마도 누락되었지만 최선의 행동 방침이 local 옵션을 지정하지 않는 것, 즉 gen_fsm 프로세스에 이름을 지정하지 않는 것 같습니다.

erlang vm 인스턴스에서 사용할 수있는 limit to the number of unique atoms이 있다는 점에 유의할 가치가 있습니다. 무작위로 많은 원자를 생성하는 것은 나쁜 생각 일 수 있습니다.

+2

확실히 나쁜 아이디어입니다! – rvirding