[Coroutine] 액터(Actor)

업데이트:

액터

액터는 코루틴에서 쓰레드간 동기화를 지원하기 위한 도구이다.

액터는 두 가지 강력한 도구의 조합이다.

  1. 상태 엑세스를 단일 스레드로 한정한다.
  2. 다른 쓰레드는 채널을 통해서 상태 수정을 요청한다.

액터 생성

actor 키워드를 사용하여 생성하며 actor 는 내부적으로 ReceivedChannel를 가지고 있는다.

아래 코드는 수신 받은 메시지 횟수 만큼 counter 값을 1 증가 시킨다.

val actorCounter = actor<Void?> {
    for (msg in channel) {
        counter++
    }
}

Client 입장에서는 Actor는 채널과 똑같기 때문에 메시지를 보낼 때 send() 를 사용한다.

val workA = async (context){

    repeat(2000) {
        actorCounter.send(null)
    }
}

val workB = async (context){

    repeat(300) {
        actorCounter.send(null)
    }
}

workA.await()
workB.await()

println(counter)

위 코드를 실행하면 2300 이라는 값을 얻을 수가 있다.

액터 기능 확장

액터가 수신받은 메시지를 확장하여 기능을 확장 할 수가 있다.

먼저 아래와 같이 메시지를 정의한다.

enum class Action {INCREASE, DECREASE}

액터는 수신 받은 메시지에 따라 counter를 증가할지 감소할 지를 결정한다.

val actorCounter = actor<Action> {
    for (msg in channel) {
        when(msg) {
            Action.INCREASE -> counter++
            Action.DECREASE -> counter--
        }
    }
}

아래와 같이 메시지를 전송해 보면

val workA = async (context){

    repeat(2000) {
        actorCounter.send(Action.INCREASE)
    }
}

val workB = async (context){

    repeat(300) {
        actorCounter.send(Action.DECREASE)
    }
}

workA.await()
workB.await()

println(counter)

몇번을 실행해도 1700 이라는 값을 얻을 수 있다.

Reference

코틀린 동시성 프로그래밍(에이콘)

댓글남기기