[Coroutine] 액터(Actor)
업데이트:
액터
액터는 코루틴에서 쓰레드간 동기화를 지원하기 위한 도구이다.
액터는 두 가지 강력한 도구의 조합이다.
- 상태 엑세스를 단일 스레드로 한정한다.
- 다른 쓰레드는 채널을 통해서 상태 수정을 요청한다.
액터 생성
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
코틀린 동시성 프로그래밍(에이콘)
댓글남기기