多点分布式Erlang简单实验

正好趁着放假,拿出以前的东西好好玩玩,今天又回顾了一遍Erlang里启动多个结点的过程,记录在此。

首先,启动两个点,foo@xxx跟bar@xxx,命令:
erl -sname foo -setcookie erlang
erl -sname bar -setcookie erlang
测试两点连通:
net_adm:ping(bar@xxx).
这里开始的时候出错来着,是由于我的/etc/hosts里边我的本机xxx的ip还是公司的,没改到家里的,ip出错了,那里自然ping不通。

在两点联通了之后,又实验了一下上次R给我们讲课中,提到的就是远程输出的问题,执行:
(foo@xxx)10> rpc:call(bar@xxx, io, format, ["haha~n"]).
就把haha打印到原地了,而实际系统中,远程连过去之后,想打印到另一端的话,就得指定那个user的方式,用另外的:
(foo@xxx)7> rpc:call(bar@xxx, io, format, [user, "haha~n", []]).
就跑过去了。

这里完了之后,程序中的要做对应的修改,从单机注册发送,改为用global的函数去做:
erlang:register(?server_name, Pid) => global:register_name(?server_name, Pid)
发送变成:
?server_name ! Msg => global:send(?server_name, Msg)

另外就是启动的时候注册的问题,可能race情况,所以用global:trans/2去做就好了:
start() -> 
    global:trans({?server_name, self()},
		 fun() ->
			 case global:whereis_name(?server_name) of
			     undefined ->
				 Pid = spawn(...),
				 global:register_name(?server_name, Pid);
			     _ ->
				 ok
			 end
		 end).

然后,就好了,可以两个点上互相有所操作了

你可能感兴趣的:(.net,erlang)