Android/Coroutine

코루틴의 suspend 에 대해서

최데브 2022. 3. 15. 22:27

코루틴은 일시중단 일단 일시중단이 가능하다.

launch 든 async 든 내부에 일시중단을 하는 동작이 있다면 코루틴은 잠시 멈춘다.

 

코루틴은 일을 협력(?) 한다는 느낌을 내포하고 있는데 

여러개의 코루틴이 존재 할 수 있고 어떤 스레드에서 동작할지 명시 해준다면

각각의 코루틴을 잠시 멈췄다가 다른 코루틴을 실행시키고 그리고 일이 마무리되면

다른 코루틴과 같이 결과를 전달하거나 서로 순서를 옮겨다니며

동작한다.

 

예를 들면

val job3 = CoroutineScope(Dispahchers.IO).async{
	//2. IO 스레드에서 작업3을 수행
    (1..100).sortedByDescending{it}
    //5. 작업3이 완료된다.
}

val job1 = CoroutineScope(Dispahchers.Main).lauch{
	//1. Main 스레드에서 작업1을 수행
 	println(1)
    //3. 작업1의 남은 작업을 위해 작업3으로부터 결과값이 필요하기 떄문에 메인 스레드는
    //작업 1을 일시중단
    val job3Result = job3.await()
    //6. 작업 3으로부터 결과를 전달받음
    //7. 작업1이 재개된다.
    job3Result.forEach{
    	println(it)
    }
    
    //4. Main 스레드에서 작업2가 수행되고 완료된다.
    val job2 = CoroutineScope(Dispahchers.Main).lauch{
    	println("job2 수행완료")
    }
}

이렇게 진행된다.

 

await는 async 의 작업이 완료 될때까지 기다리는 메소드다.

이런 코드를 보면 코루틴이 왜 일시정지가 필요한지에 대해 알게된다.

 

그럼 원래 이야기 하려고 했던 suspend 는 뭘까?

 

코루틴 내부에서 진행되는 코드들은 언제나 일시정지가 가능해야하는데 외부함수는

코루틴 외부에 적힌 함수이기 때문에 코루틴 내부에서 쓰일 수 없다.

그래서 그것을 가능하게 해주기 위해서

코루틴 외부에 적힌 함수가 코루틴 내부에 쓰일때 일시중단 될 수 있는 함수라는걸 명시해주는것이다.

 

여기서 좀 더 자세히 동작 방식을 알아보면

Suspend - 모든 Local 변수를 저장하고, 현 Scope 에서의 코루틴의 실행을 pause 한다.

Resume - pause 됐던 곳에서 , 코루틴을 계속 실행한다.

이렇게 코루틴에서는 Suspend 를 만났을때 그 시점에서 잠시 일시정지를 하고 Suspend  함수를 실행하고 돌아와서

이어서 실행하게 된다.

 

 

 

반응형