2015-03-11 6 views
6

Wenn Sie den Scala-Quellcode für scala.concurrent.Future und scala.concurrent.impl.Future lesen, scheint jede zukünftige Komposition über map eine neue Aufgabe für einen Executor zu versenden. Ich nehme an, dass dies häufig einen Kontextwechsel für den aktuellen Thread und/oder eine Zuweisung eines Threads für den Job auslöst.Scala-Futures und Threads

In Anbetracht der Tatsache, dass Funktionsströme Futures zwischen ihnen passieren müssen, um auf Ergebnisse von Futures ohne Blockierung zu handeln (oder ohne in Callback Spaghetti zu vertiefen), ist dieses "reaktive" Paradigma in der Praxis sehr teuer, wenn Code gut geschrieben ist in einer modularen Weise, wo jede Funktion nur etwas klein macht und an andere weiterreicht?

+0

Ja, es ist ... aber es soll "reaktiv" und nicht unbedingt "leistungsoptimiert" sein. –

+3

Der Ansatz, den die Standardbibliothek in dieser Hinsicht annimmt, ist eine Designentscheidung und steht im Gegensatz zu Twitter's Implementierung von Futures, die für die Thread-Affinität optimiert ist - siehe z.B. [diese Finaglers Post] (https://groups.google.com/d/msg/finaglers/yWOr7-7CmPw/TBsJenqynQQJ) für eine Diskussion. –

+0

Vielleicht würde @TravisBrown das in das Feld "Ihre Antwort" einfügen. Modulo seine Standards sind unmöglich hoch. Aber sein Kommentar ist länger als der vorherige. –

Antwort

2

Es hängt vom Ausführungskontext ab. So können Sie die Strategie wählen.

Sie Executor kann auch nur im aufrufenden Thread tun, halten Sie die Karte Anrufe auf dem gleichen Thread. Sie können Ihre eigene Strategie übergeben, indem Sie explizit den Ausführungskontext übergeben oder das Implizite verwenden.

Ich würde zuerst testen, was der Standard Fork/Join-Pool tut, indem Sie protokollieren, welcher Thread verwendet wurde. Afaik neuere Versionen verwenden manchmal den einleitenden Thread. Ich weiß jedoch nicht, ob das für zukünftige Scala-Callbacks verwendet/angewendet wird.

+0

Sorgen Sie dafür, ein Beispiel für die sichere Ableitung eines solchen Executors zu geben. _ "Protokollieren welcher Thread verwendet wurde" _ könnte auch nett sein, wenn es einfach zu erreichen wäre oder nur eine Kuriosität .... – matanster