scala - Scala - 最终超时和 Thread.sleep() 之间的区别
问题描述
我有一些需要测试的异步(ZIO)代码。如果我使用Thread.sleep()
它创建一个测试部分工作正常,我总是得到响应:
for {
saved <- database.save(smth)
result <- eventually {
Thread.sleep(20000)
database.search(...)
}
} yield result
但是,如果我使用timeout
和interval
从那时起使用相同的逻辑,eventually
它就永远无法正常工作(我有超时):
for {
saved <- database.save(smth)
result <- eventually(timeout(Span(20, Seconds)), interval(Span(20, Seconds))) {
database.search(...)
}
} yield result
我不明白为什么timeout
和interval
工作方式不同Thread.sleep
。它应该做完全相同的事情。有人可以向我解释一下并告诉我应该如何将这段代码更改为不需要使用Thread.sleep()
吗?
解决方案
假设database.search(...)
返回ZIO[]
对象。
eventually{database.search(...)}
很可能在第一次尝试后立即成功。
它成功创建了一个查询数据库的任务。然后在没有任何重试逻辑的情况下查询数据库。
关于如何使其工作:
val search: ZIO[Any, Throwable, String] = ???
val retried: ZIO[Any with Clock, Throwable, Option[String]] = search.retry(Schedule.spaced(Duration.fromMillis(1000))).timeout(Duration.fromMillis(20000))
像这样的东西应该工作。但我相信存在更优雅的解决方案。
推荐阅读
- javascript - 一次运行所有过去的作业
- python - 如何通过将第 1 列与字典中的键匹配,仅用字典值替换第 2 列中的空值?条件查找 条件替换
- jenkins - Jenkins Pipeline - 文件下载操作
- css - 更改节点悬停时的光标外观
- typescript - 浏览器与服务器代码的 Typescript 编译时条件
- powershell - 这可以反转为导出与写入内容匹配的行而不是删除吗?
- python-3.x - 我无法在 python 中使用 opencv 3.4 识别对象。问题是关于 cap.read() 的命令
- sql-server - 如何重命名 SQL Server 计算列中引用的列?
- angular - 是否可以在不从 DOM 中删除元素的情况下使用 Angular ngIf?
- c++ - 通用初始化——向量的填充构造函数