티스토리 뷰

스터디 중 Actor에 대해 이야기해주신 ㄱ담ㅇ님 일단 감사합니다 (이 글을 보실진 모르겠지만..)

아무튼 Swift Concurrency의 Actor에 대해 이야기를 나누던 중 ㄱ담ㅇ님이 Actor모델은 사실 50년전부터 있던 개념임을.. 알려주셨고, 이 내용을 들으니까 Actor의 개념에 대해 더 잘 이해할 수 있었다. 그래서 Actor모델에 대해서 적어보려고 한다.

 

 

Swift에서 Actor가 나오게 된 배경

WWDC21에서 처음으로 Swift에서의 Actor를 소개한다. 

만약 두 개의 스레드에서 쓰기 동작이 있을때, 해당 데이터에 동시에 접근하게 되면 데이터 경합(data race)이 발생한다. 데이터 경합을 피하려면 값을 바꾸지 못하는 let을 이용해 공유 가변 상태를 제거하는 방법이 있지만.. 혹은 로컬 변수로 만드는 방법이 있지만 사실 우리가 원하는 결과를 만들진 못할 것이다. 공유 가변 상태가 필요한 경우는 분명히 있다!

struct Counter {
	var value = 0
	mutating func increment() -> Int {
		value += 1
		return value
	}
}

let counter = Counter()
Task.detached {
	print(counter.increment())
}
Task.detached {
	print(counter.increment())
}

-> 이러한 상황에서 race condition이 발생한다. (두 개의 concurrenty task에 counter가 참조되기 때문)

struct Counter {
	var value = 0
	mutating func increment() -> Int {
		value += 1
		return value
	}
}

let counter = Counter()
Task.detached {
	var counter = counter
	print(counter.increment())
}
Task.detached {
	var counter = counter
	print(counter.increment())
}

-> 이러면 에러는 안나는데 결과가 우리가 원하는 값이 아니다.

 

지금까지는 이런 상황을 해결하기 위해서 atomics, lock, serial dispatchqueue 등의 도구를 이용했는데, 이들을 쓰려면 굉장히 신중하게 코딩했어야 했고, 실수가 있으면 또 에러가 났었다.

이를 쉽게 해결해주기 위해 나온것이 Swift의 Actor이고, Actor는 결국 공유 가변 상태(shared mutable state)에 대한 동기화 메커니즘이다. 그래서 Actor는 변경될 수 있고 공유되고 있는 정보를 concurrent code에서 접근할 때 안전하게 접근할 수 있게 해주는 도구이다!!

 

사실 결국 더 편하게 해주려고 애플이 뭔가를 낸거니까 어렵게 생각하지 말아보자.. ㅋ.ㅋ

 

Actor 모델 (행위자 모델)

멀티 스레딩 환경에서, 리소스를 공유하고 동시에 접근하다보면 문제가 생긴다 이러한 환경에서 문제없이 하나씩 일을 처리할 수 있도록 해주는 것이 Actor 모델이다.

 

Actor는 독립된 개체이다. 그래서 Actor 내부에서 자신의 상태를 변경할 수 있지만, 한 Actor에서 다른 Actor의 상태는 절대 변경할 수 없다. 오직 메시지를 통해서만 상호작용 할 수 있다. 그리고 한 액터 내에서는 한 번에 하나의 메시지만 처리할 수 있다. (하나의 행위자는 하나의 메시지만을 순차적으로 처리한다.!) 외부에 있는 다른 두 액터가 동시에 메시지를 보낼 수는 있지만, 이를 받는 액터가 메시지를 처리하려면 무조건 하나 하나 처리해야 하고, 이때 처리되지 않은 메시지는 어딘가에 저장되어야 하는데, 그곳이 Mailbox(우편함)이다. 결국 메시지는 우편함에서 대기하다가 처리될 수 있는 상태가 되면 하나씩 처리되는 것이다.

 

Actor는 상태를 캡슐화하고 메서드로만 의사소통하는 객체지향과 제법 비슷해 보이는데, 객체지향과는 메모리가 완전히 분리되어 있다는 점에서 다르다. 객체의 경우에는 메시지를 받으면 어떤것을 바로 하지만, 액터는 다른 액터가 변경시키지 못하고 받은 메시지를 차례로 자체적으로 수행한다는 점에서 다르다.

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함