/ Ich wundere mich, warum scalaz Task.runAsyncInterruptibly nicht unterbrochen wird, wie ich es erwarten würde - Scala, Parallelität, Task, Scalaz

frage mich warum scalaz Task.runAsyncInterrupt nicht unterbrochen wird, wie ich es erwarten würde - scala, concurrency, task, scalaz

Ich habe mir diese Präsentation angesehen https://github.com/indyscala/scalaz-task-intro/blob/master/presentation.md und war verwirrt über einen der Code-Schnipsel, die mit Task.runAsyncInterruptibly dargestellt wurden (etwas verändert erscheint unten):

import java.util.concurrent.atomic.AtomicBoolean

import scalaz.concurrent.Task
import scalaz.{-/, /-}

object Junk extends App {

val neverMind = new AtomicBoolean(false)
System.out.println(s"neverMind set to $neverMind on thread ${Thread.currentThread().getName}")

val t = Task {
System.out.println(s" in task run block on thread ${Thread.currentThread().getName}")
Thread.sleep(4000)
System.out.println(s" completed sleep of 40000 ms on thread ${Thread.currentThread().getName}")
}

Task.fork(t).
//t.
runAsyncInterruptibly({
case -/(t) => t.printStackTrace()
case /-(()) => println(s"Completed (right) branch of case on thread ${Thread.currentThread().getName}")
}, neverMind)


println("sleeping 1000, then set nevermind to true")
Thread.sleep(1000)
neverMind.set(true)
println("woke up. set cancel=true -- expect stack trace not "Completed" message")

Thread.sleep(4000)

}

Ich bin verwirrt, weil ich das "Abbrechen" -Flag gesetzt habe(neverMind.set (true)), aber ich sehe keine Stack-Ablaufverfolgung. Der Codeblock innerhalb von delay {...} druckt schließlich "wurde erfolgreich abgeschlossen." .. aber nicht sicher wo!

Ich habe Rat von einigen Kollegen gesucht, dieIch wies darauf hin, dass mein ursprüngliches Beispiel Task.fork () nicht verwendet hat, also machte ich alles im selben Thread ... doh! OK. Ich habe das korrigiert. und es funktioniert immer noch nicht.

Vielen Dank im Voraus für Ihre Unterstützung.

Antworten:

1 für die Antwort № 1

Ich denke, die Antwort hat mit dem Trampolinspielen in scalaz 'Task / Future zu tun cancel zwischen den Schritten (siehe listenInterruptibly in scalaz "s Future.

Wenn Sie die Aufgabe ändern in:

val t = Task.delay(System.out.println(s" in task run block on thread ${Thread.currentThread().getName}"))
.map(_ => Thread.sleep(4000))
.map(_ => System.out.println(s" completed sleep of 40000 ms on thread ${Thread.currentThread().getName}"))

Sie werden sehen, dass es vor dem "Complete Sleep" -Schritt abgebrochen wird. Es scheint jedoch immer noch nicht der Handler zu sein, der die Stapelverfolgung ausgibt.