Przechowywanie stanu procesu w tabeli ets będzie działało dla zachowania stanu pomiędzy awariami, a ja zwykle używam rejestru globalnego do nadawania nazwom trwałym procesów. (Gracz 200 zostanie zarejestrowany jako {player, 200}). Nie polecam korzystania z rejestru lokalnego, ponieważ wymaga on użycia atomów i jeśli masz wiele procesów potomnych, możesz szybko przeżyć limit atomów. tworzenie ich dynamicznie (jak player_200, player_201, itp.)
Przechowywanie stanu dziecka w tabeli ets ma jednak własne zagrożenia i problemy. Jeśli dziecko ulegnie awarii między momentem wystąpienia błędu a jego zapisaniem do tabeli ets, powinieneś być w porządku. Co jednak, jeśli przetwarzasz dane, które powodują, że dziecko zapisuje stan śmieci, a następnie przerywa przetwarzanie następnej wiadomości? Ponownie uruchomisz proces, załadujesz zły stan z tabeli ets i ponisz awarię następnej wiadomości. Są na pewno sposoby radzenia sobie z tym, ale powinieneś być świadomy, że jest to możliwe i obejść to.
Podczas gdy Erlang ukrywa problemy związane z dystrybucją tabeli ets do wszystkich procesów, dzieje się to kosztem procesora i potencjalnych błędów. Jeśli wprowadzasz wiele zmian w tabeli ets, zapłacisz za to w wydajności.
Jeśli twoje dzieci się załamują, czy nie powinieneś szukać sposobu na usunięcie błędnych warunków? Zwykle podejmowałbym awarię procesu jako coś, co musiałem wykorzenić przyczynę i naprawić. ?
Największym problemem związanym z używaniem tabeli ets do przechowywania stanu procesów potomnych jest potencjalny szyjka butelki, którą mogę wprowadzić. Posiadanie wielu procesów często zmieniających stan wymaga od nich aktualizacji procesu, który posiada tabelę ets z nowym stanem za każdym razem, gdy następuje zmiana. Ilekroć dziecko umiera, muszę zrestartować go z tym samym stanem, który miał przed awarią. Gdy tylko proces potomny umrze, informuje przełożonego, wysyłając {'EXIT', Pid, Reason}. Jeśli proces potomny mógłby również wysłać stan, który miał tuż przed awarią, mógłbym uruchomić ponownie w tym samym stanie i nie potrzebowałbym aktualizacji wysyłanych do tabeli ets. – Mark
Nie sądzę, że jest to możliwe w Erlangu, ale ogólnie sądzę, że byłaby to fajna funkcja. Coś w rodzaju wysyłania stosu procesu do nadzorcy, gdy dziecko się zawiesza. – Mark
@ Mark W artykule, który powołuję się w mojej odpowiedzi, wyjaśnia, w jaki sposób korzystać z gifting/dziedziczenia tabeli ETS w innym procesie, gdy proces posiadania zawiesi się, brzmi jak to, czego chcesz? – johlo