等同于 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 调用包装到 withTimeoutwithTimeoutOrNull

另一个有用的 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()
}