等同于 C# 在 Kotlin 中的 Semaphore/SemaphoreSlim?
Equivalent to C#'s Semaphore/SemaphoreSlim in Kotlin?
在 Kotlin 中是否有与 C# 的 Semaphore/SemaphoreSlim 类型等效的类型?我想将它与协同例程(非阻塞)一起使用。 IE。 WaitOneAsync().
您有几个选项来自 Java。
最常见的是使用 CountDownLatch
:
val latch = CountDownLatch(1)
async {
// Do something
latch.countDown()
}
latch.await()
通常这就足够了。
如果你有一些非常特殊的情况,你也可以使用信号量,当然:
launch {
try {
semaphore.acquire()
// Do something
}
finally {
semaphore.release()
}
}
您可以考虑使用 Kotlin 自己的 Job.join()
方法。好处是 join
是一个 suspsend
函数,不需要额外的 async
块
val latch: CompletableJob = Job()
launch {
latch.join()
}
准备就绪后调用:
latch.complete()
此外,如果您需要超时,您可以将 join
调用包装到 withTimeout
或 withTimeoutOrNull
另一个有用的 Kotlin 接口是 CompletableDeferred
。不像 Job
它 returns 完成结果。查看其 await/complete
方法
kotlinx-coroutines
现在有一个成熟的 Semaphore
class.
您可以按如下方式使用:
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
suspend fun doConcurrently(list: List<Something>) {
val semaphore = Semaphore(4) // number of permits is 4
list
.map { async { semaphore.withPermit { /* do something */ } } }
.awaitAll()
}
在 Kotlin 中是否有与 C# 的 Semaphore/SemaphoreSlim 类型等效的类型?我想将它与协同例程(非阻塞)一起使用。 IE。 WaitOneAsync().
您有几个选项来自 Java。
最常见的是使用 CountDownLatch
:
val latch = CountDownLatch(1)
async {
// Do something
latch.countDown()
}
latch.await()
通常这就足够了。
如果你有一些非常特殊的情况,你也可以使用信号量,当然:
launch {
try {
semaphore.acquire()
// Do something
}
finally {
semaphore.release()
}
}
您可以考虑使用 Kotlin 自己的 Job.join()
方法。好处是 join
是一个 suspsend
函数,不需要额外的 async
块
val latch: CompletableJob = Job()
launch {
latch.join()
}
准备就绪后调用:
latch.complete()
此外,如果您需要超时,您可以将 join
调用包装到 withTimeout
或 withTimeoutOrNull
另一个有用的 Kotlin 接口是 CompletableDeferred
。不像 Job
它 returns 完成结果。查看其 await/complete
方法
kotlinx-coroutines
现在有一个成熟的 Semaphore
class.
您可以按如下方式使用:
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
suspend fun doConcurrently(list: List<Something>) {
val semaphore = Semaphore(4) // number of permits is 4
list
.map { async { semaphore.withPermit { /* do something */ } } }
.awaitAll()
}