Asynchronous (1)
동기(Synchronous)/비동기(Asynchronous) 처리

다음과 같이 여러개의 작업을 동시에 처리할때 작업1,2가 메인작업과 별개의 작업일때

비동기(@Async)로 던져놓고 메인 작업만 완료 후 응답을 주기도 합니다.

(응답시간 0.5초, 작업1,2의 결과 받을 수 없음)

 

메인작업 : 0.5초

작업1 : 1초

작업2 : 2초

 

하지만 3가지 작업의 결과가 모두 필요할 경우 동기 처리를 하면 3.5초가 걸리지만

작업1, 2를 비동기로 처리하면 일찍 처리가 끝난 작업은 모든 작업이 완료될때까지 대기 후 응답을 줍니다.

(응답시간 2초, 3개의 작업 결과 확인 가능)

 

Kotlin

@RestController
@EnableAsync
class ThreadTest(
        val taskService: TaskService,
        val mainService: MainService
) {
    @GetMapping("task")
    fun testMapping(): String {
        val start = System.currentTimeMillis()

        val task1 = taskService.task1()
        val task2 = taskService.task2()
        val main = mainService.task()

        return "main[$main], task1[${task1.get()}], task2[${task2.get()}], total[${System.currentTimeMillis()-start}]"
    }
}

@Service
class MainService {
    fun task(): Long {
        val start = System.currentTimeMillis()
        Thread.sleep(500)
        return (System.currentTimeMillis()-start)
    }
}

@Service
class TaskService {
    @Async
    fun task1(): CompletableFuture<Long> {
        val start = System.currentTimeMillis()
        Thread.sleep(1000)
        return CompletableFuture.completedFuture(System.currentTimeMillis()-start)
    }

    @Async
    fun task2(): CompletableFuture<Long> {
        val start = System.currentTimeMillis()
        Thread.sleep(2000)
        return CompletableFuture.completedFuture(System.currentTimeMillis()-start)
    }
}

 

테스트1

http://localhost:8080/task

main[502], task1[1001], task2[2001], total[2007]


메인 작업은 처리 완료 후 비동기 작업들이 완료될때까지 대기 후 응답을 주고 있습니다.

 

테스트2

반대로 동기로 처리하는 메인작업이 오래걸릴 경우도 테스트 해보겠습니다.

(MainService의 작업시간을 3초로 늘려주세요)

 

메인작업 : 3초

작업1 : 1초

작업2 : 2초

 

http://localhost:8080/task

main[3001], task1[1001], task2[2001], total[3004]


당연히 메인작업이 처리되는동안 1,2번 작업은 비동기로 작업을 완료하고 응답을 같이 주고 있습니다.

 

 

* 동시에 여러 곳을 연동해서 결과를 취합한다거나

  자원이 남아 별도의 스레드에서 처리하고자 할 때 사용하시면 됩니다.

 

 

 

 

 

 

  Comments,   0  Trackbacks
댓글 쓰기