SOPT-HIG-WWDC / WWDC

WWDC 스터디
0 stars 0 forks source link

Beyond the basics of structured concurrency #52

Open kimscastle opened 11 months ago

kimscastle commented 11 months ago

Beyond the basics of structured concurrency

스크린샷 2023-11-17 오후 6 27 05

이러한 방식은 swift에서 권장하는 동시성 이용방법은 아니다

이 경우에는 soup를 만들기 위해서 특정작업을 기다려야하는데 이러한 방식으로 사용하는건 구조화된동시성이아니다

스크린샷 2023-11-17 오후 6 27 20

위의 코드처럼 async let을 이용해서 특정작업이 끝난후에 특정작업을 호출할수있는 구조를 만들어줄수있고 이와같은 방식이 swift에서 권장하는 동시성의 이용방법이다

func getA() async -> Int {
    try? await Task.sleep(for: .seconds(3))
    return 3
}

func getB() async -> Int {
    try? await Task.sleep(for: .seconds(5))
    return 5
}

async let은 비동기 바인이 가능하게 해주는 방식인데 위의 두개의 코드를 기존의 await을 통해서 사용하게되면

Task {
    let a = await getA()
    let b = await getB()
    print(a+b)
}

아래와같이 사용할수있고 이렇게되면 getA의 실해이끝날때까지 suspend되어서 3초후에 getB가실행되고 5초동안 suspend되어서 최종적으로는 8초의 시간이 걸리지만

Task {
    async let a = getA()
    async let b = getB()
    await print(a+b)
}

위의 코드는 getA와 getB를 동시에 호출해서 a,b라는 값이 다올떄까지 기다리기때문에 5초의시간밖에 안걸린다

스크린샷 2023-11-17 오후 6 28 11

취소를 하더라도 실제로 바로 작업이 취소되지는 않습니다

다만 작업이 취소되었으니 최대한 빨리 작업을 끝내라는 정도의 action만 취하는것이기때문에

작업취소를 명령했을때 최대한 빨리 작업을 끝내게하는건 개발자의 몫이다

스크린샷 2023-11-17 오후 6 28 23

우선순위가 더 높은 작업의 결과를 기다리면 작업트리의 자식의 우선순위가 모두 높아진다

우선순위의 상승을 되돌릴 방법은 없다

스크린샷 2023-11-17 오후 6 28 39

최초의 loop에서는 동시성작업이 너무많이생성되지 않도록 제한을 둬야합니다(정해진 최대갯수로만)

스크린샷 2023-11-17 오후 6 28 51

최대갯수만큼 작업이 실행되면 그중하나가끝나기를 기다린다

작업하나가끝났는데 중지조건을 충족하지 않는다면 새로운 작업을 생성해서 계속 진도를 나간다

이렇게 하면서 그룹내에있는 동시적인 작업의 개수가 제한된다

→ 먼저시작한작업이끝나지 않으면 새작업을 시작하지 않으니까

스크린샷 2023-11-17 오후 6 29 04

logger라는게 있는데 스터디때 한번 말해보면 좋을거같다 https://velog.io/@ryan-son/Swift-통합-로깅-시스템으로-로깅-해보자-OSLog https://hereismyblog.tistory.com/31

스크린샷 2023-11-17 오후 6 31 45

Swift 동시성 인스트루먼트는 구조화된 작업 간의 관계를 파악할 수 있게 한다