안녕하세요 !
이번에는 TaskGroup, async-let, 그리고 actor 라는 주제로 포스팅 작성해보려합니다 !
TaskGroup은 여러 개의 비동기 작업을 동시에 실행하고 관리하며 이를 통해 우리는 여러 작업을 그룹화하고, 모든 작업이 완료될 때까지 기다리립니다
await withTaskGroup(of: Void.self) { group in
group.addTask {
await doAsyncFoo()
}
group.addTask {
await doAsyncBar()
}
await group.waitForAll()
}
이 코드는 doAsyncFoo()와 doAsyncBar() 두 함수를 동시에 실행하고, 둘 다 완료될 때까지 기다립니다
TaskGroup의 강점은 여러 작업을 효율적으로 병렬 처리할 수 있다는 점입니다.
async-let은 TaskGroup과 유사하지만, 반환 값이 있는 비동기 작업을 더 간단하게 처리할 수 있게 해주고 특히 비동기 작업의 결과를 바로 사용해야 할 때 유용합니다.
async let a = getAsyncFoo()
async let b = getAsyncBar()
print(await a, await b)
getAsyncFoo()와 getAsyncBar()를 동시에 시작하고, 두 작업의 결과가 모두 필요한 시점에서 await을 사용하여 결과를 기다립니다
여러 스레드가 동시에 같은 데이터에 접근하려 할 때 발생할 수 있는 문제를 Data Race라고 하는데
이 문제를 해결하기 위해 actor 타입을 활용해야하며 actor는 자신의 상태에 대한 독점적인 접근을 보장하여 Data Race를 방지합니다.
actor Counter {
private var count = 0
func increment() -> Int {
count += 1
return count
}
}
actor의 메서드를 호출할 때는 await 키워드를 사용해야 합니다!!!
let counter = Counter()
let result = await counter.increment()
TaskGroup, async-let, 그리고 actor
이들을 적절히 활용하면 효율적이고 안전한 비동기 코드를 작성할 수 있어요
개발하실때 좀 더 공부하신 후 활요하시면 더 좋아요
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.