Wie erstelle ich zwei parallele Aufgaben, um eine Aufgabe abzubrechen, wenn eine andere fehlschlägt?

8

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:

  • Lassen Sie Task[A] und Task[B] parallel laufen und warten Sie auf die Ergebnisse;
  • Wenn eine der Aufgaben fehlschlägt, dann Abbrechen die zweite und warten Sie, bis sie beendet ist;
  • gibt die Ergebnisse beider Aufgaben zurück.

Wie würden Sie eine solche Funktion implementieren?

    
Michael 11.10.2015, 13:30
quelle

2 Antworten

3

Wie bereits erwähnt, können Sie Nondeterminism verwenden, wenn Sie die nicht fehlgeschlagene Berechnung nicht stoppen möchten. Zum Beispiel:

%Vor%

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.

    
Travis Brown 11.10.2015, 18:50
quelle
2

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.

    
ayvango 11.10.2015 17:05
quelle

Tags und Links