Pytanie w sprawie actor, scala – Czy wysyłanie aktorowi wiadomości z czegoś, co nie jest aktorem, to zła praktyka?

10

Załóżmy, że mam jakąś klasę, która ma własnośćactor_ typuActor. Czy jest ze mną problem?

def someMethod() = {
  actor_ ! "HELLO"
}

Lub czy wysyłanie wiadomości powinno być zawsze wykonywane przez innego aktora; na przykład

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}

Twoja odpowiedź

2   odpowiedź
8

ActorProxy jest automatycznie tworzony i zapisywany w wątku lokalnym. Stwarza to potencjalny wyciek pamięci, choć bardzo mały, ponieważ ActorProxy nie będzie GC'd, dopóki wątek nie będzie GC'd. ActorProxy zasadniczo pozwala wątkowi niebędącemu aktorem na wiele sposobów zachowywać się jak Aktor, w tym odbierać wiadomości.

Większy problem dotyczy zarządzania wątkiem, podobnie jak biblioteka aktorów zarządza wątkami, tak więc to, co reprezentuje kontekst logiczny, może być w jednym wątku, a innym razem w innym wątku. Dobrym przykładem może być kontener serwletów. Twój kontekst logiczny może być serwletem lub sesją, ale ActorProxy będzie związany z wątkiem, a tym samym będzie współdzielony w kontekstach logicznych. Jeśli twoi aktorzy nie odpowiadają na ActorProxy, nie jest to nic wielkiego, ale jeśli tak jest, prawdopodobnie doprowadzi to do problemów, ponieważ (a) odpowiedzi zostaną potencjalnie odebrane przez niewłaściwy kontekst lub (b) wiadomości nigdy nie są odbierane, a zatem wspomniany wcześniej mały wyciek staje się duży, gdy skrzynki pocztowe ActorProxies się zapełniają.

[Edytuj] Hmm ... Wydaje mi się, że mam problem z czytaniem pytań! Otaczanie go w bloku aktora tworzy nowy obiekt aktora, który będzie poprawnie GC po zakończeniu. Pamiętaj, że wysłanie wiadomości w bloku aktora oznacza, że ​​wysłana wiadomość zostanie wykonana w nowej reakcji na innym wątku, a nie w wątku tworzącym aktora.

Świetna odpowiedź, Eric, dzięki. Czy zawijanie wywołania w bloku „aktor {}” (jak w moim pytaniu) powoduje ten sam problem? Czy też stworzony aktor GC-stanie, gdy blok wychodzi, bez względu na to, czy wątek żyje? oxbow_lakes
0

to dlaczego nie? Jeśli spojrzysz na model czystego aktora, wszystko jest aktorem i tylko aktorzy komunikują się ze sobą, jeśli możesz zaprojektować swój kod w ten sposób .. wspaniały ... jeśli nie możesz lub nie chcesz, to możesz wysłać wiadomości od podmiotów niebędących aktorami do aktorów.

Nadawca byłby niejawnie utworzonym ActorProxy, który jest teraz powiązany z wątkiem wysyłającym. Erik Engbrecht
Nie jestem tego taki pewien. W końcu, w reakcji, czym byłby „nadawca”? oxbow_lakes

Powiązane pytania