Wspólne deseń w Erlang jest rekurencyjne pętli, który utrzymuje stan:Zapytanie o proces Erlanga dla jego stanu?
loop(State) ->
receive
Msg ->
NewState = whatever(Msg),
loop(NewState)
end.
Czy istnieje sposób do kwerendy stanu uruchomionego procesu z BIF lub śledzenia czy coś? Ponieważ wiadomości awaryjne mówią "... kiedy stan był ..." i pokazują stan awarii, myślałem, że to będzie łatwe, ale byłem rozczarowany, że nie udało mi się znaleźć bifa, który by to zrobił.
Tak więc, pomyślałem, że skorzystanie z funkcji śledzenia w module dbg spowoduje to. Niestety, uważam, że ponieważ te pętle są zoptymalizowane pod względem wywołania ogona, dbg przechwyci tylko pierwsze wywołanie funkcji.
Jakieś rozwiązanie?
Ta funkcja to sys: get_status/1. – cthulahoops
+1: sys: get_status/1 jest twoim przyjacielem. Używam tego cały czas. –
Haha, niesamowite rzeczy! Użyję tego cały czas. Nawiasem mówiąc, mam zamiar używać go tylko do debugowania, a nie do długoterminowego logowania do systemu produkcyjnego. I, oczywiście, wiem, o czym jest państwo, o którym wspominam. Nie jestem pewien, dlaczego ludzie w tym wątku wciąż chcą to wyjaśnić. Używam stanu w dokładnie taki sam sposób jak np. Joe Armstrong w swojej książce. Nie ma innego właściwego sposobu utrzymywania tymczasowego stanu w Erlang, niż przeciąganie go przez pętle rekursywne. W rzeczywistości rozumiem, że właśnie to dzieje się za kulisami w serwerze gen_server. – mwt