728x90
반응형

Android 공부/Coroutine 25

[XX캠퍼스] 11.Kotlin Coroutines & Flow ( Flow 버퍼링 )

버퍼가 없는 플로우 보내는 쪽과 받는 쪽이 모두 바쁘다고 가정해봅시다 import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow = flow { for (i in 1..3) { delay(100) emit(i) } } fun main() = runBlocking { val time = measureTimeMillis { simple().collect { value -> delay(300) println(value) } } println("Collected in $time ms") } 실행결과 1 2 3 Collected in 1249 ms buffer buffer로 버퍼를 추가해 ..

[XX캠퍼스] 10.Kotlin Coroutines & Flow ( Flow 컨텍스트 )

플로우는 코루틴 컨텍스트에서 플로우는 현재 코루틴 컨텍스트에서 호출 됩니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun log(msg: String) = println("[${Thread.currentThread().name}] $msg") fun simple(): Flow = flow { log("flow를 시작합니다.") for (i in 1..10) { emit(i) } } fun main() = runBlocking { launch(Dispatchers.IO) { simple() .collect { value -> log("${value} 를 받음.") } } } 실행결과 [DefaultDispatcher-worker-1 @..

[XX캠퍼스] 09.Kotlin Coroutines & Flow ( Flow 연산)

map filter filterNot transform take takeWhile drop dropWhile 종단 연산자(terminal operator) - reduce - fold count 연산자 플로우와 map 플로우에서 map 연산을 통해 데이터를 가공할 수 있습니다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun flowSomething(): Flow = flow { repeat(10) { emit(Random.nextInt(0, 500)) delay(10L) } } fun main() = runBlocking { flowSomething().map { // it으로 활용 "..

[XX캠퍼스] 08.Kotlin Coroutines & Flow ( Flow 기초 )

처음만나보는 플로우 Flow는 코틀린에서 쓸 수 있는 비동기 스트림입니다 - 코루틴을 사용하여 코틀린에서 쓸수 있는 스트림 - 스트림이기때문에 변화를 추적할 수 있다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun flowSomething(): Flow = flow { repeat(10) { emit(Random.nextInt(0, 500)) delay(10L) } } fun main() = runBlocking { flowSomething().collect { value -> println(value) } } Flow // Flow flow 플로우 빌더 함수를 ..

[XX캠퍼스] 07.Kotlin Coroutines & Flow (공유객체, Mutex, Actor )

공유 객체 문제 import kotlin.system.* import kotlinx.coroutines.* suspend fun massiveRun(action: suspend () -> Unit) { val n = 100 // 시작할 코루틴의 갯수 val k = 1000 // 코루틴 내에서 반복할 횟수 val elapsed = measureTimeMillis { coroutineScope { // scope for coroutines repeat(n) { launch { repeat(k) { action() } } } } } println("$elapsed ms동안 ${n * k}개의 액션을 수행했습니다.") } var counter = 0 fun main() = runBlocking { withCon..

[XX캠퍼스] 06. Kotlin Coroutines & Flow ( CEH와 슈퍼바이저 잡 )

GlobalScope 어디에도 속하지 않지만 원래부터 존재하는 전역 GlobalScope가 있습니다. 이 전역 스코프를 이용하면 코루틴을 쉽게 수행할 수 있습니다. GlobalScope는 어떤 계층에도 속하지 않고 영원히 동작하게 된다는 문제점이 있습니다. 프로그래밍에서 전역 객체를 잘 사용하지 않는 것 처럼 GlobalScope도 잘 사용하지 않습니다. import kotlin.random.Random import kotlin.system.* import kotlinx.coroutines.* suspend fun printRandom() { delay(500L) println(Random.nextInt(0, 500)) } fun main() { val job = GlobalScope.launch(Dis..

[XX캠퍼스] 05. Kotlin Coroutines & Flow ( 컨텍스트와 디스패처 )

디스페처 - 어떤 쓰레드에서 수행될지 결정 코루틴 디스패처 코루틴의 여러 디스패처 Default, IO, Unconfined, newSingleThreadContext을 사용해봅시다. import kotlinx.coroutines.* fun main() = runBlocking { launch { println("부모의 콘텍스트 / ${Thread.currentThread().name}") } launch(Dispatchers.Default) { println("Default / ${Thread.currentThread().name}") } launch(Dispatchers.IO) { println("IO / ${Thread.currentThread().name}") } launch(Dispatchers..

[XX캠퍼스] 04. Kotlin Coroutines & Flow ( 서스팬딩 함수 )

suspend 함수들의 순차적인 수행 순차적으로 suspend 함수를 먼저 수행시켜봅시다. import kotlin.random.Random import kotlin.system.* import kotlinx.coroutines.* suspend fun getRandom1(): Int { delay(1000L) return Random.nextInt(0, 500) } suspend fun getRandom2(): Int { delay(1000L) return Random.nextInt(0, 500) } fun main() = runBlocking { val elapsedTime = measureTimeMillis { val value1 = getRandom1() val value2 = getRandom2..

[XX캠퍼스] 03. Kotlin Coroutines & Flow ( 취소와 타임아웃 )

Job에 대해 취소 명시적인 Job에 대해 cancel 메서드를 호출해 취소할 수 있습니다. ( * Join 은 어떤 행동이 끈날때까지 대기하는 것 ) import kotlinx.coroutines.* suspend fun doOneTwoThree() = coroutineScope { val job1 = launch { println("launch1: ${Thread.currentThread().name}") delay(1000L) println("3!") } val job2 = launch { println("launch2: ${Thread.currentThread().name}") println("1!") } val job3 = launch { println("launch3: ${Thread.curr..

[XX캠퍼스] 02. Kotlin Coroutines & Flow ( 잡,구조화된동시성 )

잡,구조화된동시성 suspend 함수에서 코루틴 빌더 호출 import kotlinx.coroutines.* suspend fun doOneTwoThree() { launch { println("launch1: ${Thread.currentThread().name}") delay(1000L) // suspension Point println("3!") } launch { println("launch2: ${Thread.currentThread().name}") println("1!") } launch { println("launch3: ${Thread.currentThread().name}") delay(500L) // suspension Point println("2!") } println("4!") ..

728x90
반응형