Skip to content

Instantly share code, notes, and snippets.

@kamilkloch
Created June 29, 2020 21:45
Show Gist options
  • Save kamilkloch/3fe28df285511e9f10d5ddde8bd05a81 to your computer and use it in GitHub Desktop.
Save kamilkloch/3fe28df285511e9f10d5ddde8bd05a81 to your computer and use it in GitHub Desktop.
import zio.blocking._
import zio.duration._
import zio.{ZIO, console}
object ZIOInterrupt extends App {
val runtime = zio.Runtime.default
val t1 = effectBlockingInterrupt {
try {
println(s"t1 evaluating on ${Thread.currentThread()}")
Thread.sleep(200) // 1. Interrupt here
println("t1 finished")
"t1"
} catch {
case e: InterruptedException => Console.err.println(s"t1 interrupted on ${Thread.currentThread()}"); throw e
}
}
val t2 = t1.flatMap { x =>
try {
println(s"inner begin evaluating on ${Thread.currentThread()}")
Thread.sleep(200) // 2. Interrupt here
println("inner after sleep")
effectBlockingInterrupt {
try {
println(s"inner Task begin evaluating on ${Thread.currentThread()}")
Thread.sleep(200) // 3. Interrupt here
println("inner Task after sleep")
s"t2($x)"
} catch {
case e: InterruptedException => Console.err.println(s"t2 inner task interrupted on ${Thread.currentThread()}"); throw e
}
}
} catch {
case e: InterruptedException => Console.err.println(s"t1 interrupted on ${Thread.currentThread()}"); throw e
}
}
// val interruptAfter = 100.milliseconds // Does not interrupt on 1. -- see below
// val interruptAfter = 300.milliseconds // 2. Does not interrupt on 2. -- see below
val interruptAfter = 500.milliseconds // 3. Does not interrupt on 3. -- see below
val f2 = runtime.unsafeRunToFuture(t2)
Thread.sleep(interruptAfter.toMillis)
f2.cancel()
println("===============================================")
val g = for {
x <- t2.fork
_ <- console.putStrLn(s"main loop: evaluating on ${Thread.currentThread()}")
_ <- ZIO.sleep(interruptAfter) >>> x.interrupt
r <- x.join
} yield r
runtime.unsafeRun(g)
}
/*
Results:
1.
t1 evaluating on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
t1 interrupted on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
===============================================
t1 evaluating on Thread[zio-default-blocking-1-712974096,5,zio-default-blocking]
main loop: evaluating on Thread[main,5,main]
t1 finished
inner begin evaluating on Thread[zio-default-async-5-205721196,5,zio-default-async]
inner after sleep
Exception in thread "main" zio.FiberFailure: Fiber failed.
An interrupt was produced by #3.
No ZIO Trace available.
2.
t1 evaluating on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
t1 interrupted on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
===============================================
t1 evaluating on Thread[zio-default-blocking-1-712974096,5,zio-default-blocking]
main loop: evaluating on Thread[main,5,main]
t1 finished
inner begin evaluating on Thread[zio-default-async-4-205721196,5,zio-default-async]
inner after sleep
Exception in thread "main" zio.FiberFailure: Fiber failed.
An interrupt was produced by #3.
No ZIO Trace available.
3.
t1 evaluating on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
t1 finished
inner begin evaluating on Thread[zio-default-async-1-205721196,5,zio-default-async]
inner after sleep
===============================================
t1 evaluating on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
main loop: evaluating on Thread[main,5,main]
t1 finished
inner begin evaluating on Thread[zio-default-async-4-205721196,5,zio-default-async]
inner after sleep
inner Task begin evaluating on Thread[zio-default-blocking-2-712974096,5,zio-default-blocking]
inner Task after sleep
Exception in thread "main" zio.FiberFailure: Fiber failed.
An interrupt was produced by #3.
No ZIO Trace available.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment