feat: Consumerで同時実行数を制御できるように
This commit is contained in:
parent
6a3551f3b4
commit
84d0aa9fac
|
@ -1,36 +1,99 @@
|
|||
package dev.usbharu
|
||||
|
||||
import dev.usbharu.owl.AssignmentTaskServiceGrpcKt
|
||||
import dev.usbharu.owl.readyRequest
|
||||
import dev.usbharu.owl.*
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import kotlin.math.max
|
||||
|
||||
suspend fun main() {
|
||||
withContext(Dispatchers.Default) {
|
||||
var isReady = true
|
||||
AssignmentTaskServiceGrpcKt.AssignmentTaskServiceCoroutineStub(
|
||||
ManagedChannelBuilder.forAddress(
|
||||
"localhost", 50051
|
||||
).build()
|
||||
).ready(flow {
|
||||
while (isActive) {
|
||||
if (isReady) {
|
||||
emit(readyRequest {
|
||||
this.consumerId
|
||||
})
|
||||
}
|
||||
delay(500)
|
||||
}
|
||||
}).onEach {
|
||||
|
||||
}.collect()
|
||||
val channel = ManagedChannelBuilder.forAddress(
|
||||
"localhost", 50051
|
||||
).build()
|
||||
val subscribeTaskServiceCoroutineStub = SubscribeTaskServiceGrpcKt.SubscribeTaskServiceCoroutineStub(channel)
|
||||
|
||||
val assignmentTaskServiceCoroutineStub = AssignmentTaskServiceGrpcKt.AssignmentTaskServiceCoroutineStub(
|
||||
channel
|
||||
)
|
||||
|
||||
val taskResultServiceCoroutineStub = TaskResultServiceGrpcKt.TaskResultServiceCoroutineStub(channel)
|
||||
|
||||
val subscribeTask = subscribeTaskServiceCoroutineStub.subscribeTask(subscribeTaskRequest {
|
||||
this.name = ""
|
||||
this.hostname = ""
|
||||
this.tasks.addAll(listOf())
|
||||
})
|
||||
|
||||
var concurrent = 64
|
||||
val concurrentMutex = Mutex()
|
||||
var processing = 0
|
||||
val processingMutex = Mutex()
|
||||
|
||||
coroutineScope {
|
||||
launch(Dispatchers.Default) {
|
||||
taskResultServiceCoroutineStub.tasKResult(flow {
|
||||
assignmentTaskServiceCoroutineStub
|
||||
.ready(
|
||||
flow {
|
||||
while (isActive) {
|
||||
val andSet = concurrentMutex.withLock {
|
||||
val andSet = concurrent
|
||||
concurrent = 0
|
||||
andSet
|
||||
}
|
||||
if (andSet != 0) {
|
||||
emit(readyRequest {
|
||||
this.consumerId = subscribeTask.id
|
||||
this.numberOfConcurrent = andSet
|
||||
})
|
||||
continue
|
||||
}
|
||||
delay(100)
|
||||
|
||||
val withLock = processingMutex.withLock {
|
||||
processing
|
||||
}
|
||||
concurrentMutex.withLock {
|
||||
concurrent = ((64 - concurrent) - withLock).coerceIn(0, 64 - max(0, withLock))
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
.onEach {
|
||||
processingMutex.withLock {
|
||||
processing++
|
||||
}
|
||||
try {
|
||||
emit(taskResult {
|
||||
|
||||
})
|
||||
|
||||
} catch (e: Exception) {
|
||||
emit(taskResult {
|
||||
this.success = false
|
||||
})
|
||||
} finally {
|
||||
processingMutex.withLock {
|
||||
processing--
|
||||
}
|
||||
concurrentMutex.withLock {
|
||||
if (concurrent < 64) {
|
||||
concurrent++
|
||||
} else {
|
||||
concurrent = 64
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.flowOn(Dispatchers.Default)
|
||||
.collect()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue