앱 개발 분야에 종사하신다면, 응답 시간이 오래 걸리는 작업을 처리하는 것이 얼마나 골치 아픈 일인지 잘 아실 겁니다. 바로 이럴 때 코루틴이 유용하게 사용됩니다. 동시성 디자인 패턴 Brutal은 비동기 코드를 단순화하여 메인 스레드가 멈추는 것을 방지하고 사용자가 "애플리케이션이 응답하지 않습니다"라는 끔찍한 대화 상자를 접하지 않도록 합니다.
기본적으로 코루틴은 스레드와 비슷하지만 훨씬 가볍고 효율적이라고 생각할 수 있습니다. 코루틴의 핵심은 바로 이러한 방식으로 여러 작업을 실행할 수 있다는 점입니다. 여러 개의 동시 작업 일시 중단 기능 덕분에 단일 스레드에서 실행되므로 메모리를 절약하고 네트워크 또는 데이터베이스의 응답을 기다리는 동안 사용자 인터페이스가 멈추는 것을 방지합니다.
서스펜션 기능의 개념
이 모든 것이 제대로 작동하려면 Kotlin은 다음을 사용합니다. 일시 중단된 기능이 함수들은 코루틴을 실행하는 스레드를 차단하지 않고 코루틴의 실행을 일시 중지할 수 있는 기능을 제공합니다. 마치 요청한 정보를 기다리는 동안 작업을 일시 중지하는 것과 같습니다. 데이터가 준비되면 코루틴은 중단된 부분부터 다시 실행을 재개합니다.
이러한 함수는 다른 suspend 함수 내부 또는 코루틴 내부에서만 실행될 수 있습니다. 코드 실행 스레드를 변경하려면 다음을 사용합니다. withContext이를 통해 프로그램의 논리적 순서를 깨뜨리지 않고 메인 스레드에서 입력/출력 스레드로 이동할 수 있습니다.
배차 담당자와 실행 영역
모든 작업이 똑같지는 않으므로, 우리는 다음이 필요합니다. 디스패처 부패한 공무원들에게 그들이 어디에서 일해야 하는지 알려주기 위해서입니다. 우리는 그것을 가지고 있습니다. 디스패처.메인사용자 인터페이스와 상호 작용하기에 이상적입니다. 디스패처.IO네트워크 요청이나 파일 읽기에 최적화되어 있으며, 디스패처.기본값이는 대용량 JSON 파일 처리와 같은 CPU 집약적인 계산에 적합합니다. 더 자세한 내용은 다음을 참조하십시오. Main, IO 및 Default 디스패처의 올바른 사용법.
반면에 범위 (영역)은 생명주기를 제어하는 요소입니다. 사용 viewModelScope o 라이프사이클 범위 이는 메모리 누수를 방지하는 데 필수적입니다. 사용자가 화면을 닫으면 해당 영역과 연결된 모든 코루틴이 자동으로 취소되어 앱이 더 이상 존재하지 않는 뷰를 업데이트하려고 시도하는 것을 방지하기 때문입니다.
코루틴 빌더: 시작부터 비동기까지
코루틴을 설정하기 위해 여러 빌더를 사용할 수 있습니다. 가장 일반적인 것은 다음과 같습니다. 시작이는 아무런 값을 반환하지 않는 작업(실행 후 잊어버리는 방식)에 사용됩니다. 반대로 결과가 필요한 경우에는 다른 방법을 사용합니다. 비동기객체를 반환합니다. 연기 된후자의 최종 값을 얻기 위해 함수를 사용합니다. 기다리다()이는 데이터가 사용 가능해질 때까지 실행을 일시 중단합니다.
또한 있습니다 실행 차단하지만 이 코드는 현재 스레드를 완전히 차단한다는 점에 유의하세요. 코루틴의 기본 원칙에 어긋나므로 실제 운영 환경에서는 사용해서는 안 됩니다. 이 코드의 진정한 유용성은 다음과 같은 상황에서 발휘됩니다. 단위 테스트 작성 또는 간단한 콘솔 메인 함수에서.
채널을 통한 안전한 통신
두 코루틴이 서로 통신해야 할 때, 전역 변수를 공유하는 것은 임계 영역 때문에 심각한 문제를 야기할 수 있습니다. 바로 이 지점에서… 채널데이터 구조입니다. 스레드로부터 안전한 함수 간에 메시지를 전달하도록 설계되었습니다. 보내다 y 받다.
채널은 다음과 같은 역학을 통해 기능할 수 있습니다. 랑데부 (송신자와 수신자가 시간적으로 일치해야 하는 경우) 또는 다음과 같을 수 있습니다. 버퍼드채널이 기능을 사용하면 발신자를 차단하기 전에 특정 개수의 메시지를 저장할 수 있습니다. 보안 강화를 위해 하나의 메시지만 노출할 수도 있습니다. 수신채널 또는 SendChannel이를 통해 외부가 채널을 통해 할 수 있는 일을 제한하고 데이터의 무결성을 보호할 수 있습니다.
고급 패턴 및 데이터 흐름
채널 세계에는 다음과 같은 패턴들이 있습니다. 팬아웃여러 개의 손상된 루틴이 동일한 채널을 사용하여 작업을 분할하는 경우, 팬인여러 송신기가 단일 채널로 데이터를 전송하는 경우입니다. 옵저버 패턴과 유사한 것을 찾고 있다면 다음과 같이 사용할 수 있습니다. 방송채널각 메시지가 모든 구독자에게 동등하게 전달됩니다.
채널은 "핫 스트림"(아무도 듣고 있지 않을 때에도 데이터를 전송하는 스트림)인 것과는 달리, 흐름 이러한 흐름은 "콜드" 흐름입니다. 즉, 활성 소비자가 있을 때만 데이터가 생성됩니다. 흐름은 다음과 같이 구성됩니다. 흐름의 생성중간 연산자는 데이터를 필터링하거나 변환하고, 마지막으로 최종 연산자는 정보 수집을 활성화합니다.
동기화 및 원자성 관리
여러 스레드가 동일한 변수를 중복해서 사용하는 것을 방지하기 위해 몇 가지 전략이 있습니다. 우리는 다음을 사용할 수 있습니다: 뮤텍스 그 기능으로 잠금 상호 배제를 쉽게 보장하기 위해서입니다. 권한을 통해 접근을 제어하는 세마포어나 원자형 타입(예: ...)을 사용하는 방법도 있습니다. 원자정수 복잡한 잠금이 필요하지 않은 간단한 작업에 사용됩니다.
또 다른 흥미로운 기술은 다음과 같습니다. 스레드 제한이는 단일 전용 스레드(생성됨)를 할당하는 것으로 구성됩니다. 새로운 싱글스레드 컨텍스트특정 상태를 수정하기 위해 사용됩니다. 이렇게 하면 하나의 스레드만 해당 데이터를 제어할 수 있으므로 동시성 충돌이 발생하지 않습니다. 더 많은 사람들이 주제에 대해 알 수 있도록 이 정보를 공유하세요.