현문hyun답

[현문hyun답] go의 goroutine(고루틴), kotlin의 coroutine(코루틴), typescript의 generator(생성기), roblox lua의 corotuine(코루틴) 비교

Hyun-danpung2 2024. 8. 13. 01:10
728x90
반응형

0. 서론

  • Go 언어나 Kotiln 언어는 웹, 앱 또는 서버 등을 제작할 때 사용하게 되었는데, 기존에 주로 사용하던 Java나 Javascript에서는 쉽게 접하지 못했던 고루틴과 코루틴을 접하게 되었다.
  • Typescript의 생성기는 zepeto(제페토) 게임을 만들면서 접하게 되었는데 zepeto unity에서 typescript로 코드를 작성하면서 게임 내에 필요한 비동기적 작업을 generator로 쓰게 되었다.
  • Roblox Lua의 코루틴은 Roblox 게임을 만들면서 접하게 되었고 상당히 자주 사용하게 되었다.
  • 여러 언어를 사용하면서 이름은 다르지만 비슷한 기능을 사용하고 있다는 점에서 흥미가 생겨 비교를 해보게 되었다.

 

1. Go의 gorotuine(go 루틴, 고루틴)

  • Go 언어에서 경량 스레드로써, go 키워드를 사용하여 함수를 비동기적으로 실행
  • 스택 크기가 작고, 필요에 따라 동적으로 확장
  • 수천 개의 고루틴을 동시에 실행할 수 있을 정도로 높은 동시성을 지원
  • 채널(Channel)을 통해 고루틴 간 통신이 가능
go func() {
	// 비동기 작업
}()

 

 

2. Kotlin의 coroutine(코루틴)

  • 비동기 프로그래밍을 위한 경량 스레드
  • suspend 키워드를 사용하여 일시 중단 가능 함수로 정의
  • 비동기 작업을 동기식 코드처럼 작성할 수 있게 해줌
  • launch, async 등의 빌더를 사용하여 실행
  • 코루틴 컨텍스트를 통해 스레드 풀을 관리
GlobalScope.launch {
    // 비동기 작업
}

 

3. Typescript의 generator(생성기)

  • function* 구문으로 정의
  • yield 키워드를 사용하여 값을 일시적으로 반환하고, 이후 상태를 유지하면서 다시 실행할 수 있는 함수
  • 비동기 처리를 위한 Promise와 결합하여 사용
  • iterator(반복자) 패턴을 지원하여 상태를 관리
  • 비동기 로직을 순차적으로 작성할 수 있음
function* generatorFunction() {
    yield 1;
    yield 2;
}

 

4. Roblox Lua의 coroutine(코루틴)

  • 여러 실행 흐름을 동시에 관리할 수 있음
  • create, resume, yield 등의 함수로 제어
  • 멀티 스레딩을 지원하지 않지만, 비동기적으로 작업을 수행할 수 있음
  • 상태를 저장하고 복원할 수 있어, 비동기 작업을 쉽게 작성할 수 있음
co = coroutine.create(function()
    coroutine.yield()
end)

 

5. 비교

  • 경량성 및 성능
    • 고루틴과 코틀린의 코루틴은 경량 스레드로 많은 수를 동시에 실행할 수 있음
    • 생성기와 루아 코루틴은 주로 하나의 실행 흐름을 관리하는데 중점
  • 사용 용도
    • 고루틴과 코틀린의 코루틴은 서버 사이드 프로그래밍에 적합
    • 생성기는 클라이언트 사이드에서 비동기 처리를 단순화하는데 유용
    • 루아 코루틴은 게임 내 비동기 처리를 위한 도구

 

6. 결론

다양한 언어를 접하면서 느끼는 점은 한 가지 언어를 활용해 보았다면 비슷한 작업을 다른 언어로 그리 어렵지 않게 할 수 있다는 것이다. 

728x90
반응형