ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Coroutine 코루틴
    Search: SwDevTheory SwDevTheory 2020. 11. 7. 10:49

     

    의미적 개념

    순차적 프로그램에서는 일반적으로 불려지는 쪽이 부르는 쪽에 속한다.

    코루틴은 그와 달리 어느 쪽도 종속 관계가 아니라 대등한 관계로 호출되어 동작하는 것을 말한다.

    Ex: 동물을 세계를 구현시 코끼리와 원숭이 개체의 호출 동작은 서로 종속 관계가 아닌 대등한 관계로 호출되어 동작한다.

    실시간 병렬처리와 구분된다. 개별 단위로 동작하지만 최소 단위의 실행이 공존(일반적으로 process, thread가 동일)하여 공유자원에 대한 경쟁을 하지 않는다는 점에서는 Thread와 구분 된다.

    코루틴은 루틴 사이에서 제어를 옮겨 가며 실행하는 방법의 하나다. 한 루틴의 실행 중에 그 실행을 중단하고 다른 루틴으로 제어를 옮기며, 제어가 옮겨진 루틴은 가장 최근에 실행이 중단된 곳에서 그 루틴의 실행을 재개하고, 그 후 같은 방법으로 다른 루틴에 제어를 옮기는 방법을 취한다.

    Thread보다 필요 메모리가 작고 Context switch가 없다. 간단한 상황에서 코루틴을 사용해야하는 이유로 메모리와 부하가 작다.

     

    단순정리

    일반 함수에서 coroutine은 suspend(or yield)/resume가 추가 된 함수처럼 생각할 수 있다. 함수 호출하면 한번에 끝까지 가지 않고 지정된 yield코드 위치에서 멈추고 위치를 기억해두고 호출 한 곳으로 되돌아간다. 다음 호출에서는 멈춘 위치에서 시작한다.

     

    참고 설명

    링크 https://youtu.be/ZOcJXRcqIQE

     

    기타

    Unity (유니티)에서 많이 쓰인다. 정확히는 C#이다.

    C# : 2.0부터 지원된다. 

    C++ : C++20부터 stackless coroutine이 추가되었다.

    Go 언어 차원에서 Thread와 Coroutine을 혼합한 '고루틴'이라는 새로운 기능을 제공한다. 여러 Thread에서 Coroutine이 한꺼번에 실행된다. 기존의 운영체제가 제공하는 Thread보다 작고 빠른 경량 Thread 개념이며 Thread처럼 동시에 실행할 수 있다.

    Python : 2.2에서 부터 lightweight coroutine 지원이 추가되었고 이를 generator라고 부른다(기초 수준이고, 3.x부터 좀더 다양하게 지원된다).

    JavaScript : ES6이 이전에는 AJAX, 콜백을 사용해 비동기를 구현했고 ES6에서는 Promise라는 객체를 이용하면 된다. 최근 async, await 키워드가 추가되어 가독성이 더 좋아졌다.

    PHP : 5.5부터 지원된다.

    루아 : 언어의 여덟가지 기본 type 중 하나로 Coroutine이 제공된다.

     

    댓글