TSemaphore
获取许可证,但如果获取时间太长就会超时。
基本上是这样的:
ZIO.acquireReleaseWith(semaphore.acquire.commit.timeoutFail(new TimeoutException)(acquireTimeout))(_ => doStuff())(_ => semaphore.release.commit)
但是,这不起作用,因为看起来
timeout
依赖于中断光纤,但是acquireReleaseWith
不允许acquire
步骤被中断。
acquireReleaseInterruptible
不起作用,因为无论acquire
是否成功,它都会运行发布,并且我没有一个好的带外方法来判断获取是否成功。
而且
acquireReleaseInterruptibleExit
也没有真正的帮助,因为它只给我整个范围的Exit
,所以如果doStuff()
失败,那么它永远不会释放许可证。
获取步骤超时的最佳方法是什么?
我不确定这是否是最好的方法,但我发现了一些可行的方法:
ZIO.scoped {
for {
_ <- semaphore.withPermitScoped.timeoutFail(new TimeoutException)(acquireTimeout)
res <- doStuff()
} yield res
}
基本上,将调用移至执行
timout
的效果上的 acquireRelease
,而不是获取操作本身。