Hello, Android!

코루틴 launch, async 본문

Kotlin

코루틴 launch, async

lwndnjs93 2020. 9. 5. 21:59

프로세스나 스레드는 진행중인 작업을 중단하고

다른 작업을 실행하기 위한 문맥교환이 발생할때 많은 비용이 발생한다

하지만 코루틴은 문맥교환 없이 일시중단하여 비용이 적게 발생하는 장점이 있다

 

- 라이브러리 추가

코루틴을 사용하기 위해서는 라이브러리를 추가해야한다

인텔리J 에서 라이브러리를 추가하기 위해서는

File -> Project Structure -> Libraries에서 + 버튼을 눌러 From Maven

에서 Kotlinx 를 검색하여 org.jetbrains.kotlinx:kotlinx-coroutines-core:버전

을 선택하여 라이브러리를 다운받으면 된다

 

- launch

launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더 생성 이라고 한다

launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 실행할수 있으며

특정 결괏값 없이 Job객체를 반환한다

위 코드를 실행하게 되면

call in main 이 바로 출력되며 잠시 뒤 job.isActive: true, Completed: false 이 출력되며

1초 뒤 coroutine launch 5초 뒤 job.isActive: false, Completed: true 이 출력된다

 

이는 main함수는 메인 스레드에서 실행이 되며

launch내부의 코드는 코루틴 코드로 메인 스레드와는 별도로 실행이 된다

그리고 이는 메인 스레드와는 별도로 실행되므로 넌블로킹 코드이다

 

또한 위와같이 launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더의 생성 이라고 한다

launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 생성하며, 특정 결과는 없고 Job객체를 반환한다

GlobalScope.launch에서 알수있듯이 launch의 범위를 결정하는 GlobalScope가 지정되어있다

당연한 말이지만 프로그램이 종료되면 코루틴도 종료된다

즉 main함수가 종료되면 코루틴도 종료된다

 

만약 코루틴 내에서 어떠한 함수를 호출하기 위해서는

suspend로 선언된 함수들만 코루틴 내에서 호출이 가능하다

suspend함수는 일시중단이 가능하며, 다시 재개가 가능하다

앞서 launch에서 사용한 delat함수가 있는 Delay클래스를 살펴보면

delay함수 또한 suspend로 선언되어있다

이번에는 printFriends 함수 내에서 launch로 코루틴을 실행하며

suspend로 정의된 함수 두개를 호출하는데, 두 함수는 delay 시간이 서로 다르다

코루틴이 실행되기 전에 main함수가 종료되는것을 막기 위해

readLine함수로 엔터를 입력받기 전까지 기다리게 된다

 

- async

async또한 launch와 같이 코루틴 빌더를 생성한다

launch와 다른점은 Deferred<T>를 통해 결과를 반환한다

printFriends함수의 launch내부의 두 println함수를 보면

async결과에 await을 사용하였는데

await은 해당 코루틴의 작업이 끝나는 시점을 기다렸다 결과를 받아올수 있다

위의 예제는 printRyan에 딜레이 1초, printFrodo가 딜레이 3초이기때문에

어느쪽이 먼저 종료될지 알수있지만, 많은 태스크들이 병행되는 경우

어떤 루틴이 먼저 종료될지 알수없기때문에

태스크가 종료되는 시점을 기다렸다 결과를 받을수 있도록 await을 활용한다

 

 

'Kotlin' 카테고리의 다른 글

코루틴의 문맥  (0) 2020.09.12
runBlocking  (0) 2020.09.06
스레드  (0) 2020.08.29
I/O 입출력 (입력)  (0) 2020.08.16
I/O 입출력 (출력)  (0) 2020.08.15