2011-07-23 10 views
7

Mam osobę nadzorującą, która powinna rozpocząć pracę z pracownikami simple_one_for_one. Kiedy zadzwonię pod numer start_child() po raz pierwszy, wszystko pójdzie wspaniale. Ale kiedy robię to po raz drugi, dostaję {error,{already_started,<0.71.0>}}. Dlaczego simple_one_for_one kierownik zwrócił mi already_started? czego mi brakuje? To jest kod: supervisor, worker.simple_one_for_one start_child() zwraca już_started

+0

Zostaniesz straszliwie zdezorientowany z wiadomościami dotyczącymi obsługi serwera genów, odsłaniając dziecko, aby wysłać wiadomość do siebie, a następnie blokując podczas oczekiwania na otrzymanie tej wiadomości. – Dustin

+0

Dlaczego? Robię pracę w oddzielnym potomku, aby zapobiec awarii serwera gen_server. Czy to źle? Porada byłaby bardzo doceniana :-) – dijxtra

+0

Czy to byłaby katastrofa, gdyby gen_server się rozbił? Zostanie ono ponownie uruchomione przez przełożonego. Jeśli martwisz się błędami, zamiast tego zawiń połączenie za pomocą 'try ... catch ... end'. Podczas gdy procesy są tanie, nie ma korzyści z ich niepotrzebnego tworzenia i tutaj nie ma współbieżności. – rvirding

Odpowiedz

15

rejestrujesz (lokalną) nazwę swojego serwera gen_. po uruchomieniu nie można uruchomić kolejnego o tej samej nazwie.

jeśli użyjesz opcji gen_server: start_link/3, usuwając pierwszy argument z bieżącego połączenia gen_server: start_link/4, powinieneś móc uruchomić więcej niż jeden.