2013-06-04 32 views
6

Chcę zaimplementować prosty pokój rozmów, w którym dwa węzły mogą wysyłać wiadomości do siebie synchronicznie. Nie ma węzła, który pełni rolę serwera.Jak mogę wysłać wiadomość do innego węzła?

Czy mogę użyć !, aby wysłać wiadomość do innego węzła, jeśli mam pid procesu w tym węźle za pomocą funkcji spawn(Node,Module,Fun,Args)?

+0

Can Używam "!" wysłać wiadomość do odległego węzła, jeśli mam Pid procesu na tym węźle przez funkcję "spawn (Węzeł, moduł, zabawa, Args)"? –

+1

Tak, wysyłanie zdalnych wiadomości jest tak samo jak wysyłanie lokalnych –

+0

Musisz tylko upewnić się, że wszystkie węzły używają tego samego pliku cookie. – Kaos

Odpowiedz

13

Można wysyłać do procesów w innym węźle, tak samo jak w przypadku procesu lokalnego do tego samego węzła. Sztuczka polega oczywiście na tym, że musisz mieć identyfikator procesu. Ale można również wysłać do procesu zarejestrowanego w innym węźle za pomocą krotki {RegisteredName, NodeName}, np.

register(a, self()), {a, node()} ! foo. 

wyśle ​​wiadomość do Ciebie. Ta sama składnia działa na wszystkich węzłach.

Bardziej skomplikowany przykład

W pierwszej powłoce:

erl -sname one 
Erlang R15B01 (erts-5.9.1) [source] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.9.1 (abort with ^G) 
[email protected])1> ([email protected])1> register(hello_server, self()). 
([email protected])2> 
true 

W drugiej powłoce:

erl -sname two 
Erlang R15B01 (erts-5.9.1) [source] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.9.1 (abort with ^G) 
[email protected])1> ([email protected])1> {hello_server, '[email protected]'} ! good_day. 
good_day 
([email protected])2> 

I znowu w pierwszej powłoce:

([email protected])2> flush(). 
Shell got good_day 
ok 
+0

Dziękuję bardzo! Właśnie próbowałem tego, to działało dobrze. Czy możesz podać mi jakieś informacje, takie jak książki lub strony internetowe do opanowania erlangu? –

+4

@ Despicable.Me http://learnyousomeerlang.com/ to bardzo dobra książka online na temat Erlang, istnieje również wersja drukowana. W przeciwnym razie sprawdź Amazon. – rvirding

Powiązane problemy