Swift의 동시성 프로그래밍: TaskGroup, async-let, 그리고 actor

CodeCat·2024년 9월 12일
post-thumbnail

안녕하세요 !

이번에는 TaskGroup, async-let, 그리고 actor 라는 주제로 포스팅 작성해보려합니다 !

TaskGroup을 이용한 동시 처리

TaskGroup은 여러 개의 비동기 작업을 동시에 실행하고 관리하며 이를 통해 우리는 여러 작업을 그룹화하고, 모든 작업이 완료될 때까지 기다리립니다

await withTaskGroup(of: Void.self) { group in
    group.addTask {
        await doAsyncFoo()
    }
    
    group.addTask {
        await doAsyncBar()
    }
    
    await group.waitForAll()
}

이 코드는 doAsyncFoo()와 doAsyncBar() 두 함수를 동시에 실행하고, 둘 다 완료될 때까지 기다립니다

TaskGroup의 강점은 여러 작업을 효율적으로 병렬 처리할 수 있다는 점입니다.

async-let을 이용한 동시성

async-let은 TaskGroup과 유사하지만, 반환 값이 있는 비동기 작업을 더 간단하게 처리할 수 있게 해주고 특히 비동기 작업의 결과를 바로 사용해야 할 때 유용합니다.

async let a = getAsyncFoo()
async let b = getAsyncBar()
print(await a, await b)

getAsyncFoo()와 getAsyncBar()를 동시에 시작하고, 두 작업의 결과가 모두 필요한 시점에서 await을 사용하여 결과를 기다립니다

Data Race와 actor 타입

여러 스레드가 동시에 같은 데이터에 접근하려 할 때 발생할 수 있는 문제를 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

이들을 적절히 활용하면 효율적이고 안전한 비동기 코드를 작성할 수 있어요

개발하실때 좀 더 공부하신 후 활요하시면 더 좋아요

이상으로 포스팅 마무리 하겠습니다.

.
.
.

감사합니다.

profile
코드와 고양이의 만남

0개의 댓글