코루틴 동시성/ 병렬
동시성은 애플리케이션이 동시에 한개이상의 스레드에서 실행될때 발생
이 스레드간의 통신과 동기화가 되어야 애플리케이션이 정상동작 가능
동시성에 대해
- 올바른 동시성 코드
- 결정론적인 결과를 가짐
- 실행순서에는 약간의 가변성 허용 : 이를 위해 서로 다른 부분이 독립성이 있어야 하고 조정이 필요함
- 비동시성 코드
fun getProfile(id : Int) : Profile {
val basicUserInfo = getUserInfo(id)
val contactInfo = getContactInfo(id)
return createProfile(basicUserInfo,contactInfo)
}
→ 사용자정보 return 전까지 연락처정보 요청하지 않음
장점
- 정확한 실행순서를 알수있음
- 사이드 이펙트 예측 용이함
단점
- 동시성 코드에 비해 성능 저하
- 코드가 실행되는 하드웨어를 제대로 활용하지 못함
getUserInfo() : 1초 소요
getContactInfo() : 1초 소요
→ getProfile() 항상 2초이상 소요
getUserInfo - getContactInfo 의존적이지 않아보임 → 동시호출로 전체 실행시간 반으로 단축가능
- 동시성 코드
suspend fun getProfile(id :Int){
val basicUserInfo = asyncGetUserInfo(id)
val contactInfo = asyncGetContactInfo(id)
return createProfile(basicUserInfo.await(),contactInfo.await())
}
asyncGetUserInfo() asyncGetContactInfo() 서로 다른 스레드에서 실행되도록 작성
→ 코루틴이라면 같은 스레드 일 수도? 동시에 실행된다고 가정
→ 둘중 어느 함수가 먼저 완료되어 반환되든지 상관없이,
await()을 통해 둘다 반환 된 후 실행된 createProfile의 결과는 같다. → 결정론적임을 보장
순서에 상관없이 결과가 결정적임을 보장하는 것이 동시성의 까다로운 부분!
동시성은 병렬성이 아니다
두개의 코드가 동시에 실행된다는 점에서는 비슷함.
위 동시성 예제 → createProfile()은 asyncGetUserInfo() asyncGetContactInfo() 둘중 어느 함수와도 중복되지 않음
차이점
병렬성 : 두 스레드가 정확히 같은 시점에 실행될 때 발생
필요: 2개이상 코어, 2개이상 스레드
ex) 2개코어 컴퓨터: 코어 1 → asyncGetUserInfo() 코어 2 → asyncGetContactInfo()
동시성: 두개이상의 알고리즘의 실행시간이 겹쳐질 때 발생
필요: 2개이상 실행 스레드
ex) 단일코어 컴퓨터: 지정된 시점에 둘중 하나만 실행 됨. 전체일정은 겹침.
단일코어가 서로 다른 스레드의 명령을 교차배치하여 효율적으로 실행
병렬은 동시성을 의미 동시성은 병렬성이 없어도 발생
'Kotlin' 카테고리의 다른 글
Kotlin 용어, 키워드 간단정리 (일급함수, Higher-Order Functions, inline) (0) | 2022.03.06 |
---|---|
코루틴이란? - 프로세스/ 스레드/ 코루틴 (0) | 2021.05.16 |
(Kotlin) Kotlin vs Java (+ 추가기능, 코틀린 컴파일 과정) (0) | 2020.08.23 |
(Kotlin) 코틀린이란? Kotlin 소개 (0) | 2020.08.16 |
댓글