erlang的gen_server的start和start_link

很早之前研究了一段时间erlang,深深为其结构和语法吸引,使用起来也比较方便,写了一个小的server端,然后就是断断续续的改写,总是不满意。最近又拾起来修改,在写一个room的server端的时候,本来是在一个node上开几个相同代码的room,如果玩家连接进来的时候,room没有启动,则自动开启一个。但结果发现总是无法启动第二个,难道我记错了,或者程序某个地方出错了?调用appmon:start()看了以下,room的名字是room1,启动成功,其他的则是失败,告诉我已经存在了。看来问题在start上,研究了下gen_server:start和gen_server:start_link的区别:
gen_server:start启动一个独立的服务器进程
gen_server:start_link启动一个受监控的服务器进程
我一直没注意这两个区别,在appmon中,gen_server:start是看不见的,gen_server:start_link则可以在appmon中看的见。在调用上,gen_server:start_link启动的在调用时可以直接使用module的名字,而gen_server:start则只能使用Pid的方式。使用gen_server:satrt_link只能一个module只能启动一个,而gen_server:start可以启动多个。
回到起始点,想启动多个且在appmon中看的见,只要使用gen_server:start启动,然后link就可以了,在appmon中主次关系还是很智能的。
突然觉得,这样有什么用?我在使用一个不好的结构在解决一个比较简单的问题,下次还是改成数据库的方式吧,编码更方便,更不容易出错,查找也方便,这段时间实在是出力不讨好,不过,明白了那一点点的区别。

1条评论

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据