Ich habe folgende Stück Code:Blockiert dieser Scala-Actor beim Erstellen eines neuen Actors in einem Handler?
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 korrekt?
Aber wenn ich Arbeit an eine Warteschlange sende und eine (juc) Zukunft zurückbekomme, wie vermeide ich das Blockieren in dem Fall, in dem ich die Warteschlangen-API nicht kontrolliere (dh wenn ich die Arbeitswarteschlange, so dass der Verlag Ereignisse nach Abschluss der Arbeit erhält)? –
Können Sie der Arbeitswarteschlange beliebigen Code senden? Wenn dies der Fall ist, können Sie eine Berechnung mit Einheitenwerten einreichen, die mit dem Senden einer Nachricht an einen Ihrer Akteure endet. Und ignorieren Sie einfach die Zukunft [Einheit] – Apocalisp
Ich habe die Frage bearbeitet, um es ein bisschen klarer zu machen, was genau ich rufe, wenn ich submitWork. Grundsätzlich nein, ich kann keine willkürlichen Runnables/Callables einreichen. Allerdings habe ich ursprünglich den gesamten Code geschrieben, also sieht es so aus, als müsste ich nur eine API-Änderung vornehmen :-) –