Coroutine Channels 1편 - Channel이란 무엇인가, Channel 닫기, Channel 반복적으로 수신하기, Producer로 Channel 만들기

2023. 3. 5. 23:10·공식 문서 번역/Coroutines 공식 문서
반응형

Deffered 값은 두 코루틴 사이에 단일 값을 전달하는데 편리한 방법을 제공한다. Channel은 값의 스트림을 전달하는 방법을 제공한다.

 

Channel이란 무엇인가?

Channel은 개념적으로 BlockingQueue와 매우 유사하다. 주요한 다른점은 블로킹 연산인 put 대신 일시중단 연산인 send를 가지고, 블로킹 연산인 take 대신 일시중단 연산인 receive를 가진다는 점이다.*1

 

val channel = Channel<Int>()
launch {
    // this might be heavy CPU-consuming computation or async logic, we'll just send five squares
    for (x in 1..5) channel.send(x * x)
}
// here we print five received integers:
repeat(5) { println(channel.receive()) }
println("Done!")

📌 전체 코드는 이곳에서 확인할 수 있습니다.

 

코드의 출력은 다음과 같다

1
4
9
16
25
Done!

 


📖 아래 내용은 독자의 이해를 위해 번역자가 추가한 글입니다.

*1. 기존 동시성 프레임웍에서 사용하던 BlockingQueue는 모든 연산이 스레드를 블록하는 것이 기본이다. 반면 Channel은 Coroutine을 위해 설계되어 Coroutine의 Light Weight Thread 모델을 지원하여 모든 연산이 스레드를 블록하지 않는다.


이 글은 Coroutines 공식 문서를 번역한 글입니다.

 

원문 : Channels - Channel basics

원문 최종 수정 :  2022년 9월 28일


Channel 닫기와 반복적으로 수신하기

Channel은 Queue와 다르게 더이상 다른 원소들이 오지 않는 다는 것을 알리기 위해 닫힐 수 있다. Channel로부터 값을 받는쪽에서는 일반적인 for 루프를 사용해서 원소를 편하게 받을 수 있다.

 

개념적으로 close 함수는 채널로 특별한 닫기 토큰을 보내는 것과 같다. 이 닫기 토큰을 받으면 반복이 멈춘다. 따라서 닫기 토큰을 받기 전에 보내진 모든 원소들이 수신되었음을 보장할 수 있다.

 

val channel = Channel<Int>()
launch {
    for (x in 1..5) channel.send(x * x)
    channel.close() // we're done sending
}
// here we print received values using `for` loop (until the channel is closed)
for (y in channel) println(y)
println("Done!")

📌 전체 코드는 이곳에서 확인할 수 있습니다.

 


이 글은 Coroutines 공식 문서를 번역한 글입니다.

 

원문 : Channels - Closing and iteration over channels

원문 최종 수정 :  2022년 9월 28일

 


Producer로 Channel 만들기

Coroutine이 원소들의 시퀀스를 생성하는 패턴은 매우 일반적이다. 이는 동시성 코드에서 자주 발견되는 생산자-소비자 패턴의 일부이다. 생산자를 채널을 파라미터로 받는 함수로 추상화 할 수 있지만, 이는 함수로부터 결과가 반환되어야 한다는 상식과 맞지 않는다.

 

생산자측에서는 producer라는 이름을 가진 편리한 코루틴 빌더를 통해 이를 간단하게 할 수 있고, 소비자측의 for 루프를 consumeEach 확장 함수를 사용해 대체할 수 있다.

 

fun CoroutineScope.produceSquares(): ReceiveChannel<Int> = produce {
    for (x in 1..5) send(x * x)
}

fun main() = runBlocking {
    val squares = produceSquares()
    squares.consumeEach { println(it) }
    println("Done!")
}

📌 전체 코드는 이곳에서 확인할 수 있습니다.


이 글은 Coroutines 공식 문서를 번역한 글입니다.

 

원문 : Channels - Building channel producers

원문 최종 수정 :  2022년 9월 28일


목차로 돌아가기

 

Kotlin Coroutines 공식 문서 한국어 번역본 : Coroutines 한 번에 정리하기

Kotlin Coroutines 공식 문서 번역을 시작하며 Kotlin Coroutines는 Kotlin을 위한 강력한 비동기 솔루션이다. 안드로이드 실무에서는 한동안 높은 점유율을 자랑한 RxJava를 Coroutines가 대체하고 있으며, 새로

simplecode.kr

 

반응형

'공식 문서 번역 > Coroutines 공식 문서' 카테고리의 다른 글

Coroutine Channels 3편 - Fan-out과 Fan-in : Channel이 얼마나 많은 출력, 입력을 만들 수 있는지 알아보기  (0) 2023.03.07
Coroutine Channels 2편 - Channel로 파이프라인 만들기, 파이프라인으로 소수 만들기  (0) 2023.03.06
Coroutines Flow 8편 - Flow 실행하기, Flow와 Reactive Stream  (0) 2023.03.04
Coroutines Flow 7편 - Flow 수집 완료 처리하기, Flow 명령적으로 다루기 vs 선언적으로 다루기  (0) 2023.03.03
Coroutines Flow 6편 - Flow 예외 처리, Flow의 예외 투명성  (0) 2023.03.02


'공식 문서 번역/Coroutines 공식 문서' 카테고리의 다른 글
  • Coroutine Channels 3편 - Fan-out과 Fan-in : Channel이 얼마나 많은 출력, 입력을 만들 수 있는지 알아보기
  • Coroutine Channels 2편 - Channel로 파이프라인 만들기, 파이프라인으로 소수 만들기
  • Coroutines Flow 8편 - Flow 실행하기, Flow와 Reactive Stream
  • Coroutines Flow 7편 - Flow 수집 완료 처리하기, Flow 명령적으로 다루기 vs 선언적으로 다루기
심플코드
심플코드
프로그래밍을 어렵지 않게 풀어서 설명하는 기술 블로그
    반응형
  • 심플코드
    심플코드
    심플코드
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • 안드로이드를 위한 Coroutines (2)
      • Unit Testing (19)
      • GitHub Actions (0)
      • 공식 문서 번역 (35)
        • Coroutines 공식 문서 (35)
      • 알고리즘 (7)
        • Kotlin 자료구조 (0)
        • 알고리즘 (7)
        • Kotlin으로 구현하는 자료구조 (0)
      • 코딩 테스트 (0)
      • Deep Learning (0)
      • Machine Learning Math (17)
        • Linear Algebra (17)
      • ML (0)
      • Docker (15)
      • Kubernetes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 코틀린 코루틴의 정석 책 출간 소식
  • 인기 글

  • 태그

    pytorch
    Kotlin
    도커
    junit
    Coroutines Flow
    Docker
    컨테이너
    코루틴
    Machine Learning
    코루틴 Flow
    Coroutines Channel
    Coroutines Context
    numpy
    unit testing
    코루틴 채널
    TensorFlow
    unit test
    mockito
    coroutine
    Coroutines
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
심플코드
Coroutine Channels 1편 - Channel이란 무엇인가, Channel 닫기, Channel 반복적으로 수신하기, Producer로 Channel 만들기
상단으로

티스토리툴바