Ich möchte meine asynchrone Verarbeitung mit implementieren
scalaz.concurrent.Task . Ich brauche eine Funktion (Task[A], Task[B]) => Task[(A, B)]
, um eine neue Aufgabe zurückzugeben, die wie folgt funktioniert:
Task[A]
und Task[B]
parallel laufen und warten Sie auf die Ergebnisse; Wie würden Sie eine solche Funktion implementieren?
Wie bereits erwähnt, können Sie Nondeterminism
verwenden, wenn Sie die nicht fehlgeschlagene Berechnung nicht stoppen möchten. Zum Beispiel:
Und dann:
%Vor% In jedem Fall außer dem ersten wird der Nebeneffekt in waitALongTime
passieren. Wenn Sie versuchen wollten, diese Berechnung zu stoppen, müssten Sie etwas wie Task
's runAsyncInterruptibly
verwenden.
Es gibt eine seltsame Vorstellung unter Java-Entwicklern, dass Sie parallele Aufgaben nicht abbrechen sollten. Sie zerlegen Thread.stop()
und markieren sie als veraltet. Ohne Thread.stop()
könntest du die Zukunft nicht wirklich abbrechen. Alles, was Sie tun können, ist, ein Signal an die Zukunft zu senden, oder eine gemeinsam genutzte Variable zu modifizieren und Code innerhalb von Zukunft zu machen, um ihn regelmäßig zu überprüfen. So könnten alle Bibliotheken, die Futures anbieten, die einzige Möglichkeit vorschlagen, die Zukunft zu annullieren: Mach es kooperativ.
Ich stehe jetzt vor dem gleichen Problem und schreibe meine eigene Bibliothek für Futures, die storniert werden könnten. Es gibt einige Schwierigkeiten, aber sie können gelöst werden. Sie konnten Thread.stop () einfach nicht in einer beliebigen Position aufrufen. Der Thread kann das Aktualisieren von gemeinsam genutzten Variablen durchführen. Die Sperre wird normalerweise zurückgerufen, aber die Aktualisierung kann auf halbem Wege angehalten werden, z. Aktualisieren nur der Hälfte des doppelten Wertes und so weiter. Also führe ich ein Schloss ein. Wenn sich der Thread im überwachten Status befindet, sollte er jetzt von Thread.stop () gelöscht werden, aber mit dem Senden einer bestimmten Nachricht. Der bewachte Zustand gilt immer als sehr schnell abgewartet. Zu jeder anderen Zeit, mitten in der Berechnung, kann der Thread sicher gestoppt und durch einen neuen ersetzt werden.
Die Antwort lautet also: Du solltest keine Futures absagen, sonst bist du Ketzer und niemand in der Java-Community würde dir eine willige Hand geben. Sie sollten Ihren eigenen Ausführungskontext definieren, der Threads töten könnte, und Sie sollten Ihre eigene Futures-Bibliothek schreiben, die auf diesem Kontext läuft.
Tags und Links scala concurrency task scalaz