Aktorzy Scali-najgorsze praktyki?

Czuję się trochę niepewnie co do używania aktorów w Scali. Przeczytałem dokumentację o tym, jak robić rzeczy, ale myślę, że potrzebuję również niektórych zasad DON ' t, aby czuć się swobodnie z nich korzystać. Myślę, że boję się, że użyję ich w niewłaściwy sposób i nawet tego nie zauważę.

Czy można wymyślić coś, co, jeśli zostanie zastosowane, spowoduje zerwanie korzyści, jakie przynoszą aktorzy Scali, a nawet błędne wyniki?

Author: avmohan, 2009-10-11

2 answers

  • Unikaj !? o ile to możliwe. Ty dostaniesz zablokowany system!

  • Zawsze wysyłaj wiadomość z wątku aktor-podsystem. Jeśli oznacza to tworzenie aktora przejściowego za pomocą metody Actor.actor, to niech będzie:

    case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }

  • Dodaj "każdą inną wiadomość" do reakcji twojego aktora. W przeciwnym razie nie można dowiedzieć się, czy wysyłasz wiadomość do niewłaściwego aktor:

    case other => log.warning(this + " has received unexpected message " + other

  • Nie używaj Actor.actor dla swoich głównych aktorów, zamiast tego subcass Actor. Powodem tego jest to, że tylko poprzez podklasowanie można podać sensowną metodę toString. Ponownie, debugowanie aktorów jest bardzo trudne, jeśli dzienniki są zaśmiecone wypowiedziami takimi jak:]}

    12:03 [INFO] Sending RequestTrades(2009-10-12) to scala.actors.Actor$anonfun$1

  • Udokumentuj podmioty w systemie, wyraźnie określając, jakie wiadomości otrzymają i dokładnie jak powinni obliczyć odpowiedź. Za pomocą aktorzy skutkują konwersją standardowej procedury (zwykle zamkniętej w metodzie) na logikę rozłożoną na reakcje wielu aktorów. Łatwo się zgubić bez dobrej dokumentacji.

  • Zawsze upewnij się, że możesz komunikować się z aktorem poza jego pętlą react, aby znaleźć jego stan. Na przykład zawsze deklaruję metodę, która ma być wywołana przez MBean, która wygląda jak Poniższy fragment kodu. W przeciwnym razie może być bardzo trudno stwierdzić, czy twój aktor działa, jest wyłączony, ma dużą kolejkę wiadomości itp.

.

def reportState = {
  val _this = this
  synchronized {
    val msg = "%s Received request to report state with %d items in mailbox".format(
                   _this, mailboxSize) 
    log.info(msg)
  }
  Actor.actor { _this ! ReportState }
}
  • Połącz swoich aktorów i użyj trapExit = true - w przeciwnym razie mogą zawieść po cichu, co oznacza, że twój program nie robi tego, co myślisz, że jest i prawdopodobnie zniknie z pamięci, gdy wiadomości pozostaną w skrzynce pocztowej aktora.

  • Myślę, że wyróżniono kilka innych ciekawych wyborów dotyczących projektowania-decyzji, które należy podejmować przy użyciu aktorów proszę. oraz proszę.

 53
Author: oxbow_lakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:39

Wiem, że to nie odpowiada na pytanie, ale powinieneś przynajmniej wziąć sobie do serca fakt, że współbieżność oparta na wiadomościach jest znacznie mniej podatna na dziwne błędy niż współbieżność oparta na pamięci współbieżnej.

Zakładam, że widziałeś wytyczne aktora w programowaniu w Scali , ale dla przypomnienia:

  • aktorzy nie powinni blokować podczas przetwarzania wiadomości. Gdzie możesz zablokować spróbuj zorganizować, aby później otrzymać wiadomość.
  • użyj react {} raczej niż receive {} jeśli to możliwe.
  • Komunikuj się z aktorami tylko za pomocą wiadomości.
  • preferuj niezmienne wiadomości.
  • Uczyń wiadomości samowystarczalnymi.
 12
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-10 22:38:37