코루틴을 사용하여 비동기 작업을 병렬로 실행하는 완벽 가이드

  • 메인 스레드의 차단을 방지하기 위한 경량 서브프로세스로서의 코루틴의 개념 및 작동 방식.
  • 파이썬과 코틀린 같은 언어에서 비동기 처리를 하는 방식에는 근본적인 차이가 있습니다.
  • 디스패처, 스코프, 그리고 launch 및 async와 같은 생성자를 사용하여 성능과 동시성을 최적화합니다.
  • 기존의 콜백 모델에서 비동기 순차 프로그래밍으로의 전환.

코루틴을 이용한 비동기 작업의 병렬 실행

애플리케이션 성능 문제로 어려움을 겪어본 적이 있다면, 대용량 파일을 읽거나 서버에 요청을 보내는 등 시간이 오래 걸리는 작업이 가장 큰 골칫거리라는 것을 알고 있을 것입니다. 바로 이럴 때 코루틴이라는 놀라운 도구가 유용하게 사용됩니다. 코루틴을 사용하면 이러한 작업을 효율적으로 처리할 수 있습니다. 동시성을 효율적으로 관리하세요 사용자 인터페이스가 멈추거나 사용자가 불편함을 느끼지 않도록 합니다.

기본적으로 코루틴은 동기 코드처럼 보이는 비동기 코드를 작성하는 방법입니다. 서로 호출하는 함수들이 복잡하게 얽혀 있는 대신, 코루틴을 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있습니다. 실행을 일시 중지하고 다시 시작합니다. 작업 대기 시간을 줄여 프로세서가 응답을 기다리는 동안 다른 작업을 수행할 수 있도록 합니다. 본질적으로 시스템 리소스를 불필요하게 복잡하게 만들지 않고 최대한 활용하는 방법입니다.

파이썬 코루틴의 세계

파이썬은 유명한 특징 때문에 단일 스레드 언어입니다. 글로벌 통역사 잠금(GIL)갇히지 않으려면 요령이 필요합니다. 이를 위해 다음과 같은 방법을 사용합니다. 이벤트 루프이는 마치 오케스트라 지휘자가 어떤 작업을 실행하고 어떤 작업을 우선순위 대기열에 남겨둘지 결정하는 것과 같습니다. 라이브러리 비동기 여기서 핵심은 구문을 소개하는 부분입니다. async y await.

함수를 정의할 때 async def우리는 코루틴을 만들었습니다. 하지만 코루틴을 호출한다고 해서 바로 실행되는 것은 아니라는 점에 유의하세요. 실행되려면 다음이 필요합니다. 이벤트 루프에 추가하세요보통 ~에 의해 asyncio.run()여러 작업을 동시에 실행하려면 다음과 같은 옵션이 있습니다. asyncio.gather() 아니면 가장 현대적인 asyncio.TaskGroup이 기능을 사용하면 여러 작업을 체계적으로 관리할 수 있으며, 하나라도 실패하면 모든 작업을 한꺼번에 취소할 수 있습니다.

이 생태계 안에서 우리는 다음을 발견합니다. 대기 가능한 객체이들은 크게 코루틴, 태스크, 퓨처로 나뉩니다. 태스크는 동시 실행을 예약하는 데 사용됩니다. create_task(), 미래는 발생 가능한 결과를 나타내는 것이다. 아직 출시되지 않았지만, 콜백 기반의 기존 코드를 다룰 때 매우 유용합니다.

오늘의 TV 프로그램 안드로이드 앱
관련 기사 :
Kotlin: Android 및 크로스 플랫폼 앱 개발을 위한 필수 언어

Kotlin과 Android에서 코루틴 마스터하기

안드로이드 생태계에서 코루틴은 골칫거리를 피할 수 있는 구세주입니다. "콜백 지옥"이는 각 요청이 이전 요청에 의존하기 때문에 코드가 오른쪽으로 무한히 들여쓰기되는 상황입니다. Kotlin은 다음과 같은 해결책을 제시합니다. 서스펜션 기능단어로 표시됨 suspend이는 코루틴이 실행되는 스레드를 차단하지 않고 코루틴의 실행을 중지할 수 있으므로 코루틴이 반복적으로 발생하는 것을 방지합니다. 안드로이드에서 발생하는 ANR 오류, 충돌 및 커널 패닉.

이것이 효과를 발휘하려면 다음이 필요합니다. 코루틴스코프이는 작업 수명 주기를 정의하는 범위입니다. 우리는 다음을 가지고 있습니다. GlobalScope 앱이 열려 있는 동안 계속 활성화 상태를 유지해야 하는 작업의 경우, lifecycleScope 시각과 연관되어 있으며 viewModelScopeViewModel에서 데이터 작업을 수행하기에 이상적입니다. 스레드를 즉시 변경해야 하는 경우에는 다른 방법을 사용합니다. withContext이는 우리가 사용할 수 있도록 하는 서스펜션 기능입니다. 서로 다른 실행 컨텍스트 간 이동.

관제사: 내 코드는 어디에서 실행되나요?

디스패처는 코루틴이 실행될 스레드를 결정합니다. 모든 디스패처가 동일한 것은 아니며, 앱 충돌을 방지하려면 올바른 디스패처를 선택하는 것이 매우 중요합니다.

  • 태만: 수학 계산이나 복잡한 JSON 처리와 같은 CPU 집약적인 작업에 최적화되어 있습니다.
  • IO : 네트워크 요청 및 데이터베이스 접근에 가장 적합한 도구로서, 이를 위해 설계된 스레드 풀을 관리합니다. 외부 응답을 기다리세요.
  • 본관: 안드로이드 사용자 인터페이스와의 상호 작용에만 사용하도록 엄격히 제한되어 있습니다.
  • 제한 없는: 특정 스레드와 연결되어 있지 않으므로 동작이 예측 불가능하며 주의해서 사용해야 합니다.

생성자: 실행 vs 비동기

코루틴을 시작하려면 빌더를 사용합니다. 가장 일반적인 빌더는 다음과 같습니다... launch이는 작업을 트리거하고 반환합니다. 작업 객체이 일을 통해 우리는 할 수 있습니다 join() 끝나기를 기다리거나 cancel() 수술을 중단하기 위해서입니다. 반면에 우리는 async결과가 필요할 때 가장 중요한 것은 바로 이것입니다. async 반환됩니다 연기 된그리고 그 방법을 통해 await() 최종값을 복구할 수 있습니다.

실질적인 차이점은 다음과 같습니다. launch "찍고 잊어버리는" 작업에 적합합니다. async여러 작업을 병렬로 실행 그런 다음 결과를 동기화하여 전체 실행 시간을 획기적으로 단축합니다. 예를 들어, 각각 2초씩 걸리는 요청이 두 개 있는 경우 순차적으로 실행하면 4초가 걸리지만, 이 방법을 사용하면 훨씬 효율적입니다. async 그들은 총 2명만 데려갈 것입니다.

콜백부터 순차 프로그래밍까지

전통적으로 우리는 비동기 처리를 위해 콜백을 사용했습니다. 즉, 작업 완료 시 실행되는 함수를 매개변수로 전달하는 방식이었죠. 이 방식도 작동은 하지만 코드가 복잡해집니다... 읽기 어렵고 유지 관리하기 어렵습니다.코루틴으로의 전환은 이러한 메서드들을 일시 중단 함수로 변환하는 것을 포함합니다.

안드로이드에서는 일반적으로 다음과 같은 방법으로 이를 구현합니다. suspendCancellableCoroutine o suspendCoroutine이 블록들은 다리 역할을 합니다. 이것들은 우리에게 사물을 만들어 줍니다. 계속이를 통해 코루틴에게 "외부 라이브러리 콜백이 응답할 때까지 여기서 기다린 다음, 이 값을 사용하여 실행을 재개하라"고 지시할 수 있습니다. 따라서 ViewModel은 리포지토리 함수를 블록으로 감싸서 순차적으로 호출할 수 있습니다. try-catch 파라 네트워크 오류를 자연스럽게 관리하세요.

Kotlin Flow를 사용한 비동기 및 반응형 데이터 흐름
관련 기사 :
안드로이드 개발을 위한 필수 코틀린 개념 완벽 가이드

코루틴은 기존 스레드에 비해 매우 가볍습니다. 각 인스턴스마다 별도의 운영 체제 스레드를 생성하는 대신, 코루틴은 기존 스레드를 그대로 사용하기 때문에 메모리 포화 없이 수천 개의 코루틴을 실행할 수 있습니다. 기존 스레드를 재사용합니다 이를 통해 복잡한 애플리케이션도 완벽한 유동성을 유지할 수 있으며, 부하가 큰 작업은 I/O 디스패처에 위임하고 메인 스레드는 화면 업데이트 시에만 복귀합니다. 더 많은 사람들이 이 정보를 알 수 있도록 이 글을 공유해 주세요.


선호하는 소스로 추가