Zio:获取资源时如何使用超时

问题描述 投票:0回答:1

我想做的是尝试从

TSemaphore
获取许可证,但如果获取时间太长就会超时。

基本上是这样的:

ZIO.acquireReleaseWith(semaphore.acquire.commit.timeoutFail(new TimeoutException)(acquireTimeout))(_ => doStuff())(_ => semaphore.release.commit)

但是,这不起作用,因为看起来

timeout
依赖于中断光纤,但是
acquireReleaseWith
不允许
acquire
步骤被中断。

acquireReleaseInterruptible
不起作用,因为无论
acquire
是否成功,它都会运行发布,并且我没有一个好的带外方法来判断获取是否成功。

而且

acquireReleaseInterruptibleExit
也没有真正的帮助,因为它只给我整个范围的
Exit
,所以如果
doStuff()
失败,那么它永远不会释放许可证。

获取步骤超时的最佳方法是什么?

scala zio
1个回答
0
投票

我不确定这是否是最好的方法,但我发现了一些可行的方法:

ZIO.scoped {
  for {
    _ <- semaphore.withPermitScoped.timeoutFail(new TimeoutException)(acquireTimeout)
    res <- doStuff()
  } yield res
}

基本上,将调用移至执行

timout
的效果上的
acquireRelease
,而不是获取操作本身。

© www.soinside.com 2019 - 2024. All rights reserved.