Kotlin/포스팅

코틀린 동시성 통신

짜집퍼박사(짜박) 2024. 1. 9. 19:47

코틀린에서 동시성 통신은 여러 코루틴 또는 스레드 간에 정보를 교환하고 동기화하는 프로세스를 의미합니다. 다수의 동시적 실행 흐름이 동일한 자원에 접근할 때 동기화가 필요하며, 코루틴은 Mutex, Channel 등을 사용하여 통신과 동기화를 수행할 수 있습니다.

 

1. Mutex (상호배제)

Mutex는 상호배제(Mutual Exclusion)를 제공하여 여러 스레드 또는 코루틴이 공유 데이터에 안전하게 접근할 수 있도록 합니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

var counter = 0
val mutex = Mutex()

fun main() = runBlocking {
    val job = List(100) {
        launch {
            repeat(1000) {
                mutex.withLock {
                    counter++
                }
            }
        }
    }

    job.forEach { it.join() }
    println("Counter: $counter")
}

위의 예제에서 Mutex를 사용하여 여러 코루틴이 counter에 안전하게 접근하도록 보장합니다.

 

2. Channel (통신)

Channel은 생산자-소비자 패턴을 사용하여 코루틴 간에 안전하게 데이터를 교환할 수 있는 통신 수단을 제공합니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

fun main() = runBlocking {
    val channel = Channel<Int>()

    val producer = launch {
        repeat(5) {
            delay(200)
            channel.send(it)
        }
        channel.close()
    }

    val consumer = launch {
        for (element in channel) {
            println("Received: $element")
        }
    }

    producer.join()
    consumer.join()
}

위의 예제에서 Channel을 사용하여 생산자가 데이터를 보내고 소비자가 데이터를 받는 간단한 예를 보여줍니다.

 

3. Actor (상태 공유)

Actor는 코루틴 간에 메시지를 전송하고 상태를 공유하는 동기화된 방법을 제공합니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.actor

sealed class CounterMsg
object IncrementCounter : CounterMsg()
class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()

fun CoroutineScope.counterActor() = actor<CounterMsg> {
    var counter = 0
    for (msg in channel) {
        when (msg) {
            is IncrementCounter -> counter++
            is GetCounter -> msg.response.complete(counter)
        }
    }
}

fun main() = runBlocking {
    val counter = counterActor()

    repeat(1_000) {
        counter.send(IncrementCounter)
    }

    val response = CompletableDeferred<Int>()
    counter.send(GetCounter(response))
    println("Counter: ${response.await()}")

    counter.close()
}

위의 예제에서 Actor를 사용하여 코루틴 간에 counter 상태를 안전하게 공유하고 조작합니다.

 

4. Semaphore (제한된 자원 접근)

Semaphore는 제한된 개수의 자원에 대한 접근을 제어하는 데 사용됩니다.

import kotlinx.coroutines.*
import java.util.concurrent.Semaphore

val semaphore = Semaphore(2) // 최대 2개의 허용된 자원

fun main() = runBlocking {
    val jobs = List(5) {
        launch {
            println("Trying to access")
            semaphore.acquire()
            println("Accessing")
            delay(1000)
            println("Releasing")
            semaphore.release()
        }
    }

    jobs.forEach { it.join() }
}

위의 예제에서 Semaphore를 사용하여 동시에 최대 2개의 코루틴만 자원에 접근할 수 있도록 제한하고 있습니다.

동시성 통신은 안전하게 데이터를 공유하고 동기화하는 방법을 제공하여 다수의 동시적 실행 흐름이 안전하게 동작할 수 있도록 합니다. 여러 가지 통신 및 동기화 도구를 사용하여 특정 문제에 맞는 적절한 해결책을 선택할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 동시성 생산자  (0) 2024.01.10
코틀린 동시성 채널  (0) 2024.01.10
코루틴 예외 처리  (0) 2024.01.09
코루틴 디스패치  (0) 2024.01.09
코루틴 타임아웃  (0) 2024.01.09