게시글
질문&답변
delay 함수 사용 시 스레드 양보
비가싫어요님 안녕하세요. 지식공유자 조세영입니다.네 맞습니다. delay는 일시중단 이후 일정 시간 이후에 재개되고 yield는 스레드 양보 후 지연 없이 재개 요청됩니다.감사합니다.
- 1
- 2
- 36
질문&답변
강사님께서 번역해주신 코틀린 코루틴 공식 가이드 문서 문의
yunjh1008님 안녕하세요. 한국어 번역본은 다음 링크에서 확인하실 수 있습니다.https://seyoungcho2.github.io/CoroutinesKoreanTranslation/감사합니다!
- 1
- 2
- 36
질문&답변
Flow와 Channel
Seok-woo Kim님 안녕하세요. 지식 공유자 조세영입니다.Channel과 Flow에 대한 강의도 계획에 있는데요 오픈까지 조금 시간이 걸릴 것 같습니다. 혹시 오픈하게 되면 새소식을 통해 알려드릴 수 있도록 하겠습니다!감사합니다.
- 1
- 2
- 74
질문&답변
[코루틴 테스트 심화] runTest의 스레드 관련 문의
이 부분 설명을 변경한 강의가 업로드 되었습니다. 리포트 해주셔서 감사합니다!
- 1
- 2
- 102
질문&답변
[코틀린 코루틴의 정석 책 추첨 이벤트] 강의 구매 기간 관련 문의
denia park님 안녕하세요. 이 이벤트는 연말, 연초에 강의를 구매하신 분들을 위해 준비되어서 부득이하게 기간 제한을 두게 되었습니다. 구매 해주신 날짜가 2024.12.19~2025.1.18 사이이신 분들이 대상인점 양해 부탁드립니다.다만, 이전 질문과 함께 날짜 오류도 리포트 해주셔서 너무 감사해서요. seyoungcho2@gmail.com 으로 연락처를 보내주시면 소정의 연말 선물을 보내드릴 수 있도록 하겠습니다. 강의를 열심히 들어주셔서 감사합니다!
- 1
- 1
- 148
질문&답변
[코루틴 테스트 심화] runTest의 스레드 관련 문의
denia park 님 안녕하세요. 지식 공유자 조세영입니다.runTest는 기본적으로 테스트 환경에서 실행되며, 코루틴 테스트 환경에서 메인 스레드 처럼 동작하는 Test worker 스레드에서 동작합니다. 이 부분은 조금 설명이 잘못 된 부분이 있는 것 같습니다. runTest 함수가 호출되면, runTest로 만들어진 코루틴이 완료될 때까지 호출된 스레드를 점유하고 블로킹하는데요. 이 부분에서는 메인스레드에서 runTest가 호출되었습니다.즉, runTest는 Test worker 스레드에서 실행되는 것이 맞고, 메인 스레드에서 runTest가 호출되기 때문에 코루틴이 실행 완료될 때까지 메인 스레드가 블로킹되게 됩니다. 따라서 위 설명은 다음과 같이 수정되는 것이 맞습니다.runTest를 호출해 실행되는 코루틴은 호출 스레드를 블로킹하며, 내부의 모든 코루틴이 실행 완료될 때까지 종료를 방지한다.이 부분은 빠른 시일 내에 조금 더 명확한 설명으로 대체할 수 있도록 하겠습니다. 질문 주셔서 감사합니다.
- 1
- 2
- 102
질문&답변
job과 코루틴의 관계?
구쟁천님 안녕하세요. 지식 공유자 조세영입니다.withContext 호출 시 Job이 새로 생성돼 헷갈리셨을 것 같습니다. 이 강의에서 Job에 대해 설명할 때는 Job이 코루틴을 제어하기 위한 인터페이스라고 설명하고, 이에 따라 Job을 사용해 코루틴을 제어하는 방법을 위주로 설명했는데요. 실제로 Job 인터페이스는 다양한 구현체를 가지고, launch 함수 호출시 생성되는 StandaloneCoroutine을 비롯해 여러 구현체를 가지고 있습니다.(사진) withContext 호출 시에는 Job의 구현체 중 하나인 DispatchedCoroutine이 생성되지만, 저는 이것이 새로운 코루틴을 생성하기보다는 현재 코루틴의 실행 컨텍스트를 전환하는 도구(코루틴의 실행 컨텍스트가 바뀌었을 때 다른 dispatch 하고 응답을 받아올 때까지 기다리는 도구)라고 이해했습니다. 실제로 위의 코드에서 디버깅을 해보시면 Job의 구현체는 다르지만, 같은 CoroutineId를 가지게 될 것으로 보입니다. 즉, 같은 코루틴에 연결되어 있다고 이해하면 좋을 것 같습니다. 이번 강의에서는 코루틴이 추상 레벨에서 노출하는 API를 위주로 다루었고, 이 내용들은 최대한 공식 기술 문서 등의 근거 자료가 있는 부분들을 위주로 제가 이해한 내용들을 덧붙이는 방식으로 강의를 진행했습니다. 질문 주신 부분에 대한 것은 사실 공식 기술 문서나, 기타 자료에는 나와 있지 않아서 제가 라이브러리 내부를 보고 파악한 내용을 바탕으로 답변 드려 정확하지 않을 수 있는 점 양해 부탁드립니다. 감사합니다. 답변이 도움이 되면 좋을 것 같습니다.
- 3
- 2
- 157
질문&답변
코루틴의 blocking I/O작업 처리
estatecloudinc님 안녕하세요. 지식 공유자 조세영입니다.네 맞습니다. 만약 라이브러리 내부에서 스레드 양보를 하지 않는다면 스레드 반납을 통한 이점이 사라집니다. 일부 라이브러리의 경우 suspend fun으로 선언된 api를 노출하지만 내부에서는 blocking i/o를 하는 경우도 있습니다.이 경우 말씀해주신 두가지가 가져갈 수 있는 이점이 됩니다.
- 0
- 2
- 85
질문&답변
KTOR Server 에서 delay
kokoxg2님 안녕하세요. 지식 공유자 조세영입니다.제가 ktor를 실제로 사용해본 적이 없어 코드 흐름만 보고 답변 드립니다.질문 주신 코드만으로는 delay 이후 코드의 동작을 제한하는 부분이 없는 것 같아 보이는데요. delay 이후 코드가 동작하지 않는 다는건 너무 다양한 문제가 있기 때문에(모든 스레드 블로킹, 예외 발생으로 취소돼 동작하지 않는 것처럼 보이는 것, delay 재개 이후 코드에서 일시중단 후 재개 하지 않음, delay 도중 코루틴이취소됨 등) 정확한 부분은 디버깅을 해봐야 알 수 있을 것 같습니다.도움이 되었으면 좋을 것 같습니다. 감사합니다.
- 0
- 2
- 89
질문&답변
CoroutineDispatcher(Default, IO)의 limitedParallelism 관련 질문
denia park님 안녕하세요. 지식 공유자 조세영입니다.상세한 질문을 남겨 주셔서 감사합니다. 아래는 답변입니다. Dispatchers.Default 관련// CPU 코어가 4개인 컴퓨터 fun main() = runBlocking { launch(Dispatchers.Default.limitedParallelism(8)) { superCpuIntensiveTask() } launch(Dispatchers.Default) { lightCpuIntensiveTask() } println("Done") }Dispatchers.Default의 스레드풀 수를 넘어서는 숫자 혹은 스레드풀 수에 딱 맞게 스레드 수를 지정하여 limitedParallelism 함수를 실행하는 경우,Dispatchers.Default의 모든 스레드들은 제가 지정한 해당 작업을 처리하기 위해 계속 작업을 하고, 해당 작업이 시작된 이후에 Dispatchers.Default로 지정하여 실행한 코루틴 작업들은 제가 지정한 작업이 끝나기 전까지는 모두 대기하게 되는 것인가요??예를 들어, CPU 코어가 4개인 컴퓨터라면 Dispatchers.Default의 스레드 풀에 들어있는 스레드 수는 4개가 될테고, 해당 상황에서 Dispatchers.Default.limitedParallelism(4) 혹은 스레드가 몇개 있는지 몰라 Dispatchers.Default.limitedParallelism(8) 이렇게 지정하는 경우에아래 코드를 기준으로 하면 제가 먼저 시킨 작업(superCpuIntensiveTask())이 끝나기 전에는 lightCpuIntensiveTask()는 실행되지 않는 것일까요?(※ 멀티 스레드 작업이기 때문에 아래의 lightCpuIntensiveTask()가 먼저 실행될 가능성도 있지만 아주 재수가 나쁘게 superCpuIntensiveTask()가 먼저 실행이 된다면 어떻게 되는지가 궁금합니다) // CPU 코어가 4개인 컴퓨터 fun main() = runBlocking { launch(Dispatchers.Default.limitedParallelism(3)) { superCpuIntensiveTask() } launch(Dispatchers.Default.limitedParallelism(3)) { superCpuIntensiveTask2() } launch(Dispatchers.Default.limitedParallelism(2)) { CpuIntensiveTask() } println("Done") }답변코루틴은 실행 순서가 보장되지 않습니다. 뒤의 launch로 생성된 코루틴이 먼저 스레드를 점유해 실행될 수도 있어 실행 순서를 보장하려면 join을 써주셔야 합니다. 이 부분은 CPU Intensive Task이더라도 마찬가지입니다. 1번과 비슷한 질문입니다. CPU 코어가 4개인 컴퓨터에서 Dispatchers.Default.limitedParallelism를 여러번 사용한 경우, 코드상으로 보면 사용해야 하는 스레드의 수가 전체 스레드풀 수를 넘어서는 숫자가 되는데 이 경우에는 어떻게 스레드를 나눠서 사용하는 걸까요 ?답변Dispatchers.Default.limitedParallelism은 특정 작업을 위해 사용할 스레드를 제한하는 역할을 하는 것입니다. 여러 번 사용하더라도 4개의 스레드 중 일부로 제한되는 과정을 거치게 됩니다. Dispatchers.IO 관련Dispatchers.IO.limitedParallelism를 사용하면 새로운 Thread 집합을 만든다고 말씀해주셨습니다.그림에서 표현해주신 것처럼 기존에는 개별로 존재하는 Thread들을 새로 그룹으로 묶어낸다고 이해를 하면 되는 것일까요 ??(사진) 답변더욱 정확히는 스레드를 새로 생성하는 것이라고 이해해주시면 좋을 것 같습니다. 스레드는 비싼 자원이기 때문에 미리 정의된 Dispatcher(Dispatchers.IO)는 처음부터 모든 스레드를 생성해 놓는 것이 아닌, 필요할 때 스레드를 생성하는 방식을 택합니다.Dispatchers.IO.limitedParallelism으로 묶여있던 Thread들은 해당 코루틴이 끝나면 다시 그룹이 풀리는 것일까요 ??답변Dispatchers.IO.limitedParallelism로 생성된 디스패처가 메모리에 있는 동안은 그룹이 유지됩니다. 스레드는 작업이 없다면 정리될 수 있습니다. 만약에 Dispatchers.IO.limitedParallelism를 많이 사용하여 이미 기존의 스레드들 모두가 집합으로 구성이 되어있는 경우에는 신규로 집합을 만들 수가 없는 경우에는 해당 Dispatchers.IO.limitedParallelism 요청이 어떻게 되는지 궁금합니다.답변Dispatchers.IO.limitedParallelism는 스레드를 무제한으로 생성할 수 있습니다. 다만 이렇게 무제한으로 생성할 경우 메모리에 문제가 생길 수 있습니다.limitedParallelism의 Thread 수 지정해당 코드와 같이 Dispatchers.Default.limitedParallelism(4) Thread 수를 지정해야 할때, 어떤 기준으로 어떻게 Thread 수를 지정해야 좋을까요 ?? 강사님만의 팁이 있으시면 공유가 가능하실까요?? 답변 먼저 개인적으로는 꼭 필요한 경우가 아니면 지정하지 않는 편입니다. 가끔 동영상 처리나 이미지 처리를 위해 사용할 스레드 수 제한이 꼭 필요한 경우가 있는데요. 그때는 작업의 중요도에 따라 다르게 설정하기 때문에 딱 몇개라고 말씀 드리기가 어렵습니다.1번과 관련된 질문입니다. Thread 수를 지정할 때 현재 Thread Pool에 존재하거나 남아있는 쓰레드가 몇개인지 충분히 고려를 하면서 코드를 짜야할까요 ??실수로 스레드 풀의 전체 Thread 수를 넘어선 요청을 하게 되면 어떻게 되는지 궁금합니다.답변JVM 스레드는 OS 레벨의 스레드에 별도로 스캐쥴링 되는 과정을 거칩니다. 이 때문에 스레드를 너무 많이 생성하는 것이 아닌 이상, Thread 수 지정 시 스레드의 개수가 문제가 될 가능성은 적을 것 같습니다. 답변이 도움이 되었으면 좋을 것 같습니다. 질문 주신 내용들 중 수업에서 다룬 범위를 넘어가는 내용이 있어 답변의 키워드를 바탕으로 추가로 학습이 필요하실 수 있습니다. 참고 부탁드립니다.감사합니다.
- 1
- 1
- 123