erlang NIF的一些想法及杂念

昨天回了一趟上海,其中有家公司使用erlang做服务器,感兴趣就看了看,
大概聊了聊。这几个月一直在看关于C#的内容,都没有看过或者写过
erlang的代码了,感觉生疏了好多。

大约去年11月份的时候吧,我头一次注意到erlang的NIF,其实,我当
时是在找JNI相关的一些资料,然后就大概看了一下NIF的流程,结构,写
了一些代码做测试使用。之后就再也没有碰过了。

昨天聊的时候,想到了mysql的过程存储,感觉如果erlang来弄的话,
会更方便,如果结合NIF的话,在存储的过程中,即实现了逻辑,也简化了
存储的操作步骤,而且还很高效,对我而言,更感兴趣的是接口的封装提
供了很大的便利性,想一想在做架构的时候可以少些很多代码,确实很不
错,要知道我最讨厌的是审代码,每次一碰到这种事情总看的我想吐。

但这里对于我而言,如果使用服务器的话,觉得有一些问题,主要是想
满足下面的场景:

在NIF的执行过程中,需要调用erlang实现的另外一个函数,或者向另
外的erlang进程发送消息,执行完成后,接着执行NIF的代码,然后返回到
erlang的调用环境中。

比如说在网游的战斗中,当使用过程存储的方法时,在erlang的查询函
数中,修改玩家自身的属性是一个(比如在NIF中计算结果,并返回结果),可能还需要同时调用别的玩家的一些
功能函数(在NIF中调用别的erlang函数运算),如果复杂的话,NIF计算,
并将一部分数据发送给需要的玩家进程,或者仅仅调用函数,总的做完之
后,再将需要的数据存储,调用mnesia:tran….什么的(我记不住函数,
基本上都是写了一个之后编辑器自动补充的)

我知道erlang中可以通过drive的方式或者port的方式来实现调用,
erl_interface在单独的进程中也可以调用某个节点的函数或者给进程发送
消息,相关的例子代码显示这样子是可以的,我并没有去验证(官方给的
例子似乎也不用验证吧),但不知道是否可以在NIF中使用。

如果可以在NIF中使用的话最好了,不知道erl_interface有没有调用本
地节点的函数,如果没有的话,就只好使用调用远程节点的函数了,不知
道效率会不会降低太多。如果效率降低太多的话,大不了将函数都修改为
进程,大家一些消息来消息去的。

明天又要出去一趟了,没有时间去验证想法了。等回到上海了再验证吧,
最近自己似乎都在跑来跑去的,在电脑前都呆不了多长时间。不过,考虑
下乡下的网络条件和时不时的来下停电之类的,就很头疼。网络时不时的
抽风下,网站也时不时的抽风下,如果不幸停电的话,至于来电的时候网
站是不是会自动启动就不敢肯定了,不过从前几次来看,运气还算不错,
都可以恢复,不过挂在路由器上的2T硬盘(做NFS使用)就比较惨了,来电的时候自检太
长时间,导致第一次不会自动挂载,需要重启路由才行。等下个月回到上
海就会稳定多了。

过段时间考虑买两个Pi,来做家里的服务器,现在路由器兼职的内容太
多了,每次看到剩余只有2MB内存可用就担心一些功能出现问题(虽然有交
换内存,但还是担心)

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你