scala - Scala Monix,如何杀死正在运行或计划的任务
问题描述
我将Monix用于异步任务工作流。
我们如何杀死跑步者Task
?
Task{ println("sleep")
Thread.sleep(200)
println("effect") }
.doOnCancel(Task(println("canceled")))
.timeout(100.milli) // timeout will do cancel
.runOnComplete(println)
@> Failure(java.util.concurrent.TimeoutException: Task timed-out after 100 milliseconds of inactivity)
sleep
canceled
effect <--- what !? , task is running. Isn't it canceled !?
我认为我目前的解决方案很丑(标志检查阻碍了代码重用):
var flag=true
Task{
println("sleep")
Thread.sleep(200)
if (flag)
println("effect")
}
.doOnCancel(Task{ flag=false; println("canceled") })
.timeout(100.milli) // timeout will do cancel
如果不可能,我们如何在 not-yet-ran 时杀死计划的Task
?
我失败的尝试是:
Task{ println("sleep"); Thread.sleep(200) }
.map{ _ => println("effect") }
.doOnCancel(Task(println("canceled")))
.timeout(100.milli) // timeout will do cancel
.runOnComplete(println)
可悲的是,它仍然显示取消发生后的效果。我希望可以取消已计划且尚未运行的任务(这.map(...)
是另一个Task
,对吗?)
解决方案
If you don't use Thread.sleep
(which messes with the internals of Monix), but Task.sleep
, things are working just fine.
Task
.defer {
println("start")
Task.sleep(1000.millis)
}
.map(_ => println("effect"))
.timeout(10.millis)
.doOnCancel(Task(println("canceling")))
Now, the question is what's your actual use case, because I'm sure you used Thread.sleep
just for illustration purposes.
推荐阅读
- postgresql - 连接到 Postgres 的 Kotlin 错误:org.postgresql.util.PSQLException:发生异常情况导致驱动程序失败
- node.js - 如何在使用 Google Drive API v3 移动文件之前检查文件是否已完成上传?
- javascript - 为什么 react-select 不适用于状态选项?
- python - 在python中将元素添加到dict列表的最佳方法是什么?
- react-native - 反应原生开发构建工作,但登录后发布 apk 崩溃
- javascript - 对 Node.js 中的事件循环调用的确切代码感到困惑
- swift - 斯威夫特用户界面。如何保持 VIPER 协议添加 EnvironmentObject?
- angular - 模拟器IONIC5出现白屏
- python - 检查日期是否为假期 [TypeError: an integer is required (got type Holiday)]
- r - 指定闪亮的表格行数