gpt4 book ai didi

Scala - 最终超时和 Thread.sleep() 之间的区别

转载 作者:行者123 更新时间:2023-12-02 19:06:23 25 4
gpt4 key购买 nike

我有一些异步(ZIO)代码,我需要测试它们。如果我使用 Thread.sleep() 创建测试部分,它工作正常并且我总是得到响应:

for {
saved <- database.save(smth)
result <- eventually {
Thread.sleep(20000)
database.search(...)
}
} yield result

但是,如果我使用 timeoutinterval from finally 做出相同的逻辑,那么它永远不会正常工作(我超时了):

for {
saved <- database.save(smth)
result <- eventually(timeout(Span(20, Seconds)), interval(Span(20, Seconds))) {
database.search(...)
}
} yield result

我不明白为什么timeoutinterval的工作方式与Thread.sleep不同。它应该做完全相同的事情。有人可以向我解释一下并告诉我应该如何更改此代码以不需要使用 Thread.sleep() 吗?

最佳答案

假设database.search(...)返回ZIO[]对象。

最终{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))

类似的东西应该有效。但我相信存在更优雅的解决方案。

关于Scala - 最终超时和 Thread.sleep() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65003143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com