Hat dieser Scala Schauspieler Block, wenn in einem Handler neuen Akteur zu schaffen?

StackOverflow https://stackoverflow.com/questions/954520

  •  11-09-2019
  •  | 
  •  

Frage

Ich habe das folgende Stück Code:

actor {
  loop {
     react {
       case SomeEvent =>
         //I want to submit a piece of work to a queue and then send a response 
         //when that is finished. However, I don't want *this* actor to block
         val params = "Some args"
         val f: Future[Any] = myQueue.submitWork( params );
         actor {
           //await here
           val response = f.get
           publisher ! response
         }

     }
  }
}

Wie ich es verstanden, die äußere Darsteller nicht auf f.get blockieren, weil die tatsächlich von einem separaten Schauspieler durchgeführt wird (der einen im Inneren des SomeEvent Handler erstellt).

Ist das richtig?

War es hilfreich?

Lösung

Ja, das ist richtig. Ihre äußere Schauspieler wird einfach ein Schauspieler erstellen und unterbrechen (für seine nächste Nachricht warten). Jedoch sehr vorsichtig sein, diese Art der Sache. Der innere Schauspieler wird automatisch auf dem Scheduler, gestartet von einem Faden verarbeitet werden. Das Gewinde blockiert auf dieser Zukunft (das sieht aus wie ein java.util.concurrent.Future mir). Wenn Sie dies oft genug tun, können Sie in Hunger Probleme laufen, in der alle verfügbaren Threads auf Futures blockieren. Ein Schauspieler ist im Grunde eine Arbeitswarteschlange, so dass Sie stattdessen diese Semantik verwendet werden soll.

Hier ist eine Version des Codes, die Scalaz Schauspieler Bibliothek . Diese Bibliothek ist viel einfacher und leichter zu verstehen als die Standard-Scala Akteure (die Quelle ist buchstäblich eine Seite und eine Hälfte). Es führt auch zu viel knappere Code:

actor {(e: SomeEvent) => promise { ... } to publisher }

Diese Version ist vollständig nicht-blockierend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top