Szukałem, jak mogę osadzić języki (użyjmy Lua jako przykładu) w Erlang. To oczywiście nie jest nowy pomysł i istnieje wiele bibliotek, które mogą to zrobić. Zastanawiałem się jednak, czy można uruchomić Genserver ze stanem zmodyfikowanym przez Lua. Oznacza to, że po uruchomieniu Genserver rozpocznie się (długotrwały) proces Lua, aby manipulować stanem Genserver. Wiem, że to również możliwe, ale zastanawiałem się, czy mogę odrodzić 1000 10 000, a nawet 100 000 tych procesów.Erlang spawning duże ilości procesów C
Nie znam tego tematu, ale zrobiłem pewne badania. (Proszę poprawić mnie, jeśli się mylę przy którejkolwiek z tych opcji).
TLDR; Przejdź do ostatniego akapitu.
pierwsza opcja: NFI:
To nie wydaje się opcja, ponieważ będzie blokować Erlang Scheduler aktualnego procesu. Jeśli chcę odrodzić dużą ich ilość, zamrozi cały czas działania.
Druga opcja: Port Kierowca:
To jak NIF ale komunikuje się poprzez wysłanie danych do określonego portu, który może również wysyłać dane z powrotem do Erlang. To jest miłe, chociaż wydaje się, że blokuje to harmonogram. Wypróbowałem bibliotekę, która obsługuje również kotłów, ale zdawało się, że blokuje harmonogram po utworzeniu 10 procesów. Zajrzałem również do postgresql przykład na Dokumentacji Erlang, która jest podobno asynchroniczne, ale nie mogłem uzyskać przykładowy kod do pracy (R13?). Czy możliwe jest uruchamianie wielu procesów sterownika portu bez blokowania środowiska wykonawczego?
Trzecia opcja: C Węzły:
Myślałem, że to bardzo ciekawy i chciałem go wypróbować, ale widocznie projekt „Erlang-lua” już to robi. To miło, ponieważ nie zawiedzie twojej maszyny Erlang VM, jeśli coś pójdzie nie tak i procesy zostaną odizolowane. Aby jednak odrodzić się w jednym procesie, trzeba odrodzić cały węzeł. Nie mam pojęcia, ile to kosztuje. Nie jestem też pewny, jaki jest limit łączenia węzłów w klastrze, ale nie widzę siebie odradzania 100 000 węzłów C.
Czwarta opcja: Porty:
Na początku myślałem, że to było takie samo jak sterownik portu, ale to faktycznie inna. Odradzasz proces, który wykonuje aplikację i komunikuje się przez STDIN i STDOUT. Byłoby to dobre rozwiązanie do tworzenia wielu procesów i (jak sądzę?), Że nie stanowią one zagrożenia dla maszyny wirtualnej Erlang. Ale jeśli mam zamiar komunikować się za pomocą STDIN/STDOUT, to po co zawracać sobie głowę językiem z możliwością osadzania? Równie dobrze można użyć dowolnego innego języka skryptowego.
Po wielu badaniach na polu, z którym nie jestem zaznajomiony, doszedłem do tego. Możesz Genserver jako "byt", gdzie AI jest napisane w Lua. Właśnie dlatego chciałbym mieć procesy dla każdej jednostki. Moje pytanie brzmi: w jaki sposób mogę stworzyć wiele genserverów, które komunikują się z długimi procesami Lua? Czy to możliwe? Czy powinienem inaczej radzić sobie z moim problemem?
Czy kod Lua naprawdę musi całkowicie przejąć wątek jądra? Czy może być skonfigurowany w taki sposób, aby mógł zarejestrować się w wywołaniu zwrotnym lub powiadomieniu, aby mógł ponownie podać wątek jądra do Erlanga, a następnie oddzwonić, gdy wydarzenie, które go interesuje, nastąpi? –
W konkretnym przypadku Lua możesz zajrzeć na https://github.com/rvirding/luerl, który jest implementacją Lua w Erlang. Wystarczy załadować i uruchomić kod Lua w procesie erlang (dzięki czemu można mieć wiele równoczesnych oceniających Lua). – johlo