대머리개발자

코루틴 조으다! 본문

개발이야기/코틀린

코루틴 조으다!

대머리개발자 2024. 3. 19. 00:10
728x90

 

절차지향적으로 진행하면 여러모로 편하다!!! 두말하면 잔소리다.

동시에 복잡하게.. 진행 되면 돌머리인 내가 팔로우 하기가 너무 힘들다 ㅠ

 

그리고 기본적으로 절차적으로 해결해도 크게 무리 없다. (성능적인 리스크는 있겠지만)

 

물리적인 파일을 등록하면서 관련 메타 정보를 등록하고

해당 파일을 pdf로 변경하는 로직이 있다고 하자.

 

100메가 정도의  파워포인트 파일을 pdf로 변경한다면 꽤나 무거운 작업이 될 것이다.

(파일을 업로드는 하는 시간 + PDF 변환 시간)

 

사용자에게도 바로 pdf를 리턴해 주지 않아도 되는 그림이기 때문에  PDF 변경 작업은 천천히 백그라운에서 작업을 하면 된다. 

 

따라서 사용자에겐 파일 업로드만 하고 정상적인 리턴 값을 주면 된다.

각각 병렬로 진행하면 되는 부분이다.

 

요롤때 간단하게 아래처럼 간단하게 이용하면 된다.

GlobalScope.launc() {}

 

메인을 실행하면 바로 리턴 되고 끝나기 때문에

pdf 변환은 지대로 되는지 확인하기 위해 Thread.sleep(6000)을 추가한다. pdf 변환 작업이 delay(5000)이기 때문에.ㅎ

fun main() {
  println( test())
  Thread.sleep(6000)
}

@OptIn(DelicateCoroutinesApi::class)
fun test() = runBlocking{
    GlobalScope.launch(Dispatchers.IO) {  callPdfChangeAPI() }
    return@runBlocking saveBasicData()
}

fun saveBasicData(): String {
    return "saveBasicData" ///.....1
}

suspend fun callPdfChangeAPI(): String {
    delay(5000) 
    println("change....")  
    return "Good job"     ///......2
}

 

 

 

 

SMS나.. 색인은 메인 프로세스와 별개로 진행하면 되는 부분이다!! 야호!

suspend fun asyncProcess(menu:Map<*, *>, boardDto: BoardDto) {
    try{
        if(menu.containsKey("alarm") && menu["alarm"] == boardDto.userId ){
            // sms
            HttpRequest(RequestContext.getThreadLocal().token!!)
                .sendMessage(menu["title"].toString(), menu["content"].toString())
        }
        if(menu.containsKey("solr")){
           // 검색 호출
            SolrUtil(boardDto).addAndCommit()
        }
    }catch (_:Exception){
        //. 예외와 상관없이 메인 쓰레드는 진행해야함.
    }
}

 

728x90