Kotlin에서 코루틴 생성 및 실행

David Mbochi Njonge 2023년1월30일
  1. 코틀린의 코루틴
  2. Kotlin에서 새 프로젝트 생성 및 종속성 추가
  3. Kotlin에서 순차적으로 코루틴 생성 및 실행
  4. Kotlin에서 동시에 코루틴 생성 및 실행
  5. 결론
Kotlin에서 코루틴 생성 및 실행

이 튜토리얼에서는 코루틴을 소개하고 Kotlin에서 async- await()를 사용하여 코루틴을 순차적으로 또는 동시에 실행하는 방법을 보여줍니다.

코틀린의 코루틴

코루틴은 동기 프로그래밍만 지원하는 다른 일반 프로시저에 비해 비동기 프로그래밍을 지원한다는 점을 제외하고는 프로시저로 볼 수 있습니다.

비동기 프로그래밍은 특정 지점에서 작업 실행을 일시 중단하고 일시 중단된 작업이 일부 백그라운드 작업이 실행되기를 기다리는 동안 다른 작업에 실행을 위임할 수 있는 기술입니다. 이러한 백그라운드 작업에는 데이터베이스에서 레코드 읽기, 웹 페이지 콘텐츠 다운로드, 애플리케이션에서 사용자 요청 처리 등이 포함될 수 있습니다.

동기 프로그래밍에서 작업의 실행은 어느 시점에서도 중단되지 않고 스레드는 실행이 완료될 때까지 독점적으로 사용됩니다.

코루틴은 일시 중단된 루틴의 이 인스턴스를 나타냅니다. 스레드로 볼 수도 있지만 코루틴은 다른 스레드에서 실행을 일시 중지하고 재개할 수 있으므로 기본 스레드에 종속되지 않습니다.

이 튜토리얼에서는 async- await() 함수가 올바른 순서로 실행되도록 하여 순차 및 동시 코루틴을 생성하는 방법을 배웁니다.

Kotlin에서 새 프로젝트 생성 및 종속성 추가

IntelliJ로 이동하여 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열리는 창에서 프로젝트 이름으로 kotlinCoroutines를 입력하고 언어 섹션에서 Kotlin, 빌드 시스템 섹션에서 Gradle을 선택한 다음 Create 버튼을 누릅니다.

Kotlin에서 코루틴으로 작업하려면 애플리케이션에 코루틴 종속성을 추가해야 합니다. build.gradle.kts 파일로 이동하여 다음 종속성이 있는지 확인하십시오.

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2")
    testImplementation(kotlin("test"))
}

종속성을 다운로드하려면 활성 인터넷 연결이 있어야 합니다. 종속성이 다운로드되면 Gradle 변경 사항을 로드하고 다음 단계를 계속합니다.

Kotlin에서 순차적으로 코루틴 생성 및 실행

애플리케이션의 기본 패키지가 될 kotlin 폴더 아래 com/coroutine 패키지를 만듭니다. coroutine 폴더 아래에 Main.kt 파일을 생성하고 다음 코드를 복사하여 파일에 붙여넣습니다.

package com.coroutine

import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

suspend fun executeProcedureOne(): Int{
    delay(3000L)
    println("procedure one executed")
    return 50;
}

suspend fun executeProcedureTwo(): Int{
    delay(1000L)
    println("procedure two executed")
    return 30;
}

fun main(): Unit = runBlocking {
    val value = async {
        executeProcedureOne()
    }
    value.await()
    val secondValue = async {
        executeProcedureTwo()
    }
    secondValue.await()
}

위의 코드에서 executeProcedureOne()executeProcedureTwo()라는 두 가지 메서드를 정의했으며 일부 백그라운드 작업을 수행하기 위해 일시 ​​중단할 수 있습니다. 이는 위와 같이 suspend 키워드를 사용하여 실현됩니다.

이 두 메서드는 기본 스레드를 차단하지 않고 일시 중단될 수 있습니다.

runBlocking이라는 기능에 주요 기능을 할당했습니다. runBlocking 함수는 메인 스레드에서 실행되고 함수 내부의 코루틴 실행이 완료될 때까지 차단되는 코루틴을 생성하는 빌더 함수입니다.

runBlocking 함수 내에서 executeProcedureOne()executeProcedureTwo() 메서드를 각각 호출하는 두 개의 async 함수를 만들었습니다.

async 함수는 새로운 코루틴을 생성하고 지연된을 반환하는 코루틴 빌더입니다. Deferred는 값을 반환하겠다는 약속을 나타내는 미래이며 await()를 사용하여 값을 검색할 수 있습니다.

async 바로 다음에 await()를 호출하면 내부 코루틴이 실행 중이기 때문에 코루틴이 일시 중단되고 완료되면 다시 시작됩니다.

위의 코드는 모든 async 함수가 완료될 때까지 코루틴을 일시 중단하고 다른 코루틴으로 이동할 수 있을 때까지 await() 메서드로 순차적으로 실행됩니다.

위의 코드를 실행하여 가장 오랜 시간이 지연되더라도 executeProcedureTwo()보다 먼저 executeProcedureOne()이 완료된다는 점에 유의하세요. 출력은 아래와 같습니다.

procedure one executed
procedure two executed

Kotlin에서 동시에 코루틴 생성 및 실행

이전 코드에 주석을 달고 다음 코드를 주석 바로 뒤에 있는 Main.kt 파일에 복사하여 붙여넣습니다.

suspend fun executeProcedureOne(): Int{
    delay(3000L)
    println("procedure one executed")
    return 50;
}

suspend fun executeProcedureTwo(): Int{
    delay(1000L)
    println("procedure two executed")
    return 30;
}

suspend fun executeProcedures() = coroutineScope{
    val firstValue = async {
        executeProcedureOne()
    }

    val secondValue = async {
        executeProcedureTwo()
    }

    firstValue.await()
    secondValue.await()
}

fun main(): Unit = runBlocking  {
    executeProcedures()
}

코루틴 일시 중단을 방지하기 위해 함수가 실행된 후 async 코루틴 빌더를 coroutineScopeawait()가 있는 다른 일시 중단 가능한 함수로 이동하여 이전 예제를 동시가 되도록 수정했습니다.

coroutineScoperunBlocking의 차이점은 coroutineScope가 일시 중단되고 기본 스레드를 해제하여 다른 작업을 계속 실행한다는 것입니다.

위의 코드를 실행하고 executeProcedureOne() 메서드보다 지연 시간이 짧기 때문에 executeProcedureTwo() 메서드가 먼저 실행된다는 점에 유의하세요. 출력은 아래와 같습니다.

procedure two executed
procedure one executed

결론

이 튜토리얼에서는 코루틴이 무엇인지, async- await() 함수를 활용하여 코루틴을 순차적으로 또는 동시에 실행하는 방법을 배웠습니다. 또한 비동기 프로그래밍, 동기 프로그래밍, runBlocking{} 함수 및 coroutineScope{} 함수를 포함하여 코루틴과 관련된 몇 가지 일반적인 개념을 배웠습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

관련 문장 - Kotlin Coroutine