맨위로가기

코루틴

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

코루틴은 서브루틴과 유사하지만, 실행을 일시 중지하고 나중에 중단된 지점부터 다시 시작할 수 있는 프로그래밍 개념이다. 코루틴은 상태를 유지하며, 제어 전송 방식, 일급 객체 지원 여부, 중첩 함수 호출에서의 중단 가능 여부에 따라 유형이 나뉜다. 서브루틴, 스레드, 제너레이터 등과 비교되며, 협력적 멀티태스킹 방식으로 동작하여 동시성을 제공하고, 하드 실시간 환경에서 유용하게 사용될 수 있다. C++, C#, Go, Python 등 다양한 프로그래밍 언어에서 네이티브로 지원하며, 클로저, 스위치 문, 스레드, 파이버 등을 사용하여 구현할 수 있다.

더 읽어볼만한 페이지

  • 병행 컴퓨팅 - 슈퍼컴퓨터
    슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다.
  • 병행 컴퓨팅 - 프로세스
    프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스로, 운영 체제가 시스템 자원을 효율적으로 관리하며 멀티태스킹 환경에서 독립적인 실행 흐름을 유지한다.
  • 함수 (프로그래밍) - 사용자 정의 함수
    사용자 정의 함수는 프로그래밍 언어와 데이터베이스 시스템에서 사용자가 직접 정의하여 재사용할 수 있는 코드 블록이다.
  • 함수 (프로그래밍) - 익명 함수
    익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
코루틴

2. 정의 및 유형

코루틴에 대한 정확한 정의는 하나로 정해져 있지 않다. 1980년 크리스토퍼 D. 말린[2]은 코루틴의 널리 인정되는 두 가지 기본 특징을 요약했다.


  • 코루틴에 로컬인 데이터의 값은 연속적인 호출 사이에서 유지된다.
  • 코루틴의 실행은 제어가 코루틴을 떠날 때 중단되었다가, 나중에 제어가 코루틴에 다시 들어올 때 중단되었던 지점부터 계속 진행된다.


이 외에도 코루틴 구현에는 다음 3가지 기능이 있다.

  • 제어 전송 메커니즘. ''비대칭 코루틴''은 일반적으로 `yield` 및 `resume`과 같은 키워드를 제공한다. 프로그래머는 양보할 프레임을 자유롭게 선택할 수 없다. 런타임은 현재 코루틴의 가장 가까운 호출자에게만 양보한다. 반면에, ''대칭 코루틴''에서 프로그래머는 양보 대상을 지정해야 한다.
  • 코루틴이 프로그래머가 자유롭게 조작할 수 있는 일급 객체로 언어에 제공되는지, 아니면 제한된 구조로 제공되는지 여부.
  • 코루틴이 중첩된 함수 호출 내에서 실행을 중단할 수 있는지 여부. 이러한 코루틴은 ''스택풀 코루틴''이다. 반대로, 정규 함수가 `yield` 키워드를 사용할 수 없는 ''스택리스 코루틴''이 있다(코루틴으로 표시되지 않는 한).


2009년에 발표된 논문 "Revisiting Coroutines"[3]은 일급 코루틴을 지원하고 스택풀인 코루틴을 나타내기 위해 ''풀 코루틴''이라는 용어를 제안했다. 풀 코루틴은 일회용 지속 및 경계 지정된 지속과 동일한 표현력을 갖기 때문에 자체 이름을 가질 자격이 있다. 풀 코루틴은 대칭 또는 비대칭이다. 중요한 것은 코루틴이 대칭인지 비대칭인지 여부는 표현력에 아무런 영향을 미치지 않는다는 점이다. 풀 코루틴은 비 풀 코루틴보다 더 표현력이 뛰어나지만, 대칭 코루틴과 비대칭 코루틴은 표현력이 동일하다. 표현력은 동일하지만, 비대칭 코루틴은 제어가 항상 호출자에게 다시 전달된다는 점에서 루틴 기반 제어 구조와 더 유사하며, 프로그래머가 더 익숙하게 느낄 수 있다.

3. 다른 개념과의 비교

코루틴은 다른 프로그래밍 개념들과 비교했을 때 몇 가지 독특한 특징을 가진다.


  • '''서브루틴''': 서브루틴은 코루틴의 특수한 경우로 볼 수 있다. 서브루틴은 한 번 호출되면 시작부터 끝까지 실행되고 종료되지만, 코루틴은 실행 중에 다른 코루틴에게 제어를 양보(yield)하고 나중에 그 지점부터 다시 실행을 재개할 수 있다. 이러한 특성으로 코루틴은 상태를 유지하며 여러 번 호출되어도 그 상태가 보존된다.

  • '''스레드''': 코루틴은 스레드와 유사하지만, 스레드가 운영체제에 의해 선점형으로 실행되는 반면 코루틴은 협력적으로 실행된다. 즉, 코루틴은 스스로 제어를 양보하기 전까지는 계속 실행된다. 이는 코루틴을 동시성 프로그래밍에는 유용하게 만들지만, 병렬성을 제공하지는 않는다. 코루틴은 스레드에 비해 다음과 같은 장점을 가진다.
  • 하드 실시간 환경에서 사용 가능하다.
  • 스위칭 시 시스템 호출이나 블로킹 호출이 필요 없다.
  • 임계 구역 보호를 위한 동기화 메커니즘(뮤텍스, 세마포어 등)이 필요 없다.
  • 운영체제의 지원이 필요 없다.

  • '''제너레이터''': 제너레이터는 '세미코루틴'이라고도 불리는 코루틴의 하위 집합이다.[4] 코루틴과 제너레이터 모두 여러 번 양보(yield)하고 재진입할 수 있지만, 코루틴은 양보 후 실행 위치를 제어할 수 있는 반면 제너레이터는 호출자에게 제어를 반환한다.[5] 제너레이터는 주로 반복자를 쉽게 만드는 데 사용되며, `yield`는 값을 상위 루틴으로 전달한다. 하지만 최상위 디스패처 루틴을 통해 제너레이터 기반으로 코루틴을 구현할 수도 있다.

  • '''상호 재귀''': 코루틴을 이용한 상태 머신이나 동시성 구현은 상호 재귀와 유사하다. 둘 다 제어를 다른 루틴으로 변경하지만, 코루틴은 상태를 유지하고 양보(yield) 후 실행을 재개하므로 더 유연하고 효율적이다. 상호 재귀 서브루틴은 상태를 매개변수로 전달하거나 공유 변수를 사용해야 하고, 매 호출마다 새로운 스택 프레임이 필요하지만, 코루틴은 기존 컨텍스트를 사용하고 점프를 통해 제어를 전달한다.

3. 1. 서브루틴

서브루틴은 코루틴의 특수한 경우이다. 서브루틴이 호출되면 실행은 시작 부분에서 시작되며, 서브루틴이 종료되면 완료된다. 서브루틴의 인스턴스는 한 번만 반환되며 호출 간에 상태를 유지하지 않는다. 반대로, 코루틴은 다른 코루틴을 호출하여 종료될 수 있으며, 다른 코루틴은 원래 코루틴에서 호출되었던 지점으로 나중에 돌아올 수 있다. 코루틴의 관점에서 보면 종료되는 것이 아니라 다른 코루틴을 호출하는 것이다. 따라서 코루틴 인스턴스는 상태를 유지하며 호출 간에 변경된다. 주어진 코루틴의 여러 인스턴스가 동시에 존재할 수 있다. 다른 코루틴을 "양보"하여 호출하는 것과 단순히 다른 루틴을 호출하는 것(그런 다음에도 원래 지점으로 돌아간다)의 차이점은, 서로 양보하는 두 코루틴 사이의 관계가 호출자와 피호출자의 관계가 아니라 대칭적이라는 것이다.

모든 서브루틴은 ''yield''를 호출하지 않는 코루틴으로 변환될 수 있다.

3. 2. 스레드

코루틴은 스레드와 매우 유사하다. 그러나 코루틴은 협력적으로 멀티태스킹되는 반면, 스레드는 일반적으로 선점형으로 멀티태스킹된다. 코루틴은 전체 결과는 변경하지 않으면서 작업이 순서에 관계없이 또는 변경 가능한 순서로 수행될 수 있도록 하므로 동시성을 제공하지만, 여러 작업을 동시에 실행하지 않으므로 병렬성을 제공하지는 않는다. 코루틴이 스레드보다 갖는 장점은 다음과 같다. 하드 실시간 컨텍스트에서 사용할 수 있으며(스위칭시 어떠한 시스템 호출이나 블로킹 호출도 필요하지 않음), 임계 구역을 보호하기 위해 뮤텍스나 세마포어와 같은 동기화 기본 요소가 필요하지 않으며, 운영 체제의 지원이 필요하지 않다.

호출 코드에 투명한 방식으로 선점적으로 예약된 스레드를 사용하여 코루틴을 구현할 수 있지만, 일부 장점(특히 하드 실시간 작동에 적합하고 상호 간의 스위칭이 비교적 저렴함)은 손실될 것이다.

3. 3. 제너레이터

제너레이터는 세미코루틴이라고도 불리며,[4] 코루틴의 하위 집합이다. 두 기능 모두 여러 번 양보하여 실행을 일시 중지하고 여러 진입점에서 재진입을 허용할 수 있지만, 코루틴이 양보 직후 실행이 계속되는 위치를 제어할 수 있는 반면, 제너레이터는 그럴 수 없고 대신 제어 권한을 제너레이터의 호출자로 다시 전달한다는 점에서 차이가 있다.[5] 즉, 제너레이터는 주로 반복자의 작성을 단순화하는 데 사용되므로, 제너레이터의 `yield` 문은 점프할 코루틴을 지정하지 않고, 대신 값을 상위 루틴으로 다시 전달한다.

그러나 제너레이터 기능을 기반으로 코루틴을 구현하는 것은 여전히 가능하며, 제너레이터에서 다시 전달된 토큰으로 식별되는 하위 제너레이터에 제어 권한을 명시적으로 전달하는 최상위 디스패처 루틴(본질적으로 트램펄린)의 도움을 받는다.

제너레이터 지원은 있지만 네이티브 코루틴이 없는 언어(예: 파이썬 2.5 이전)의 코루틴 구현의 상당수는 아래와 같은 모델 또는 이와 유사한 모델을 사용한다.

```text

''var'' q := new queue

'''generator''' produce

'''loop'''

'''while''' q is not full

create some new items

add the items to q

'''yield'''

'''generator''' consume

'''loop'''

'''while''' q is not empty

remove some items from q

use the items

'''yield'''

'''subroutine''' dispatcher

''var'' d := new dictionary('''generator''' → '''iterator''')

d[produce] := '''start''' consume

d[consume] := '''start''' produce

''var'' current := produce

'''loop'''

'''call''' current

current := '''next''' d[current]

'''call''' dispatcher

3. 4. 상호 재귀

코루틴을 사용하여 상태 기계나 동시성을 구현하는 것은 꼬리 재귀를 사용하는 상호 재귀와 유사하며, 두 경우 모두 제어가 일련의 루틴 중 다른 루틴으로 변경된다는 점이 같다. 그러나 코루틴은 더 유연하고 일반적으로 더 효율적이다. 코루틴은 반환(return) 대신 양보(yield)하고, 처음부터 다시 시작하는 대신 실행을 재개하기 때문에, 변수(클로저(closure)와 마찬가지로)와 실행 지점 모두 상태를 유지할 수 있으며, 양보는 꼬리 위치에 국한되지 않는다. 상호 재귀 서브루틴은 공유 변수를 사용하거나 상태를 매개변수로 전달해야 한다. 또한 서브루틴의 각 상호 재귀 호출에는 새로운 스택 프레임이 필요하지만 (꼬리 호출 제거가 구현되지 않은 경우), 코루틴 간에 제어를 전달하는 것은 기존 컨텍스트를 사용하며 점프를 통해 간단하게 구현할 수 있다.

4. 일반적인 용도

코루틴은 상태 기계나 동시성을 구현하는 데 사용될 수 있으며, 이는 상호 재귀와 유사하다. 하지만 코루틴은 더 유연하고 효율적이다. 코루틴은 반환(return) 대신 양보(yield)하고 실행을 재개하기 때문에 상태를 유지할 수 있으며, 양보는 꼬리 위치에 국한되지 않는다. 반면 상호 재귀 서브루틴은 공유 변수를 사용하거나 상태를 매개변수로 전달해야 한다. 또한 코루틴 간의 제어 전달은 기존 컨텍스트를 사용하며 점프로 구현할 수 있지만, 상호 재귀 호출에는 새로운 스택 프레임이 필요하다.

코루틴은 다음과 같은 구현에 유용하다.


  • 상태 기계: 하나의 서브루틴 내에서 상태 기계를 구현할 때, 코루틴을 사용하면 goto를 사용하는 것보다 가독성이 좋은 코드를 작성할 수 있다.
  • 액터 모델 동시성: 비디오 게임과 같이 여러 액터가 동시에 실행되는 환경에서, 각 액터는 자체 프로시저를 가지면서 중앙 스케줄러에게 제어권을 양보하여 순차적으로 실행되도록 할 수 있다. (이는 협력적 멀티태스킹의 일종이다.)
  • 제너레이터: 특히 입출력 및 데이터 구조 순회에 유용하다.
  • 통신 순차 프로세스: 각 하위 프로세스가 코루틴인 경우, 채널 입력/출력 및 블로킹 연산은 코루틴을 양보하고, 스케줄러는 완료 이벤트 발생 시 코루틴을 언블록한다.
  • 역 통신: 수학 소프트웨어에서 솔버, 적분 계산기 등이 방정식을 평가하거나 피적분 함수를 평가하는 계산을 수행하는 데 필요한 프로세스와 통신하는 데 사용된다.

5. 프로그래밍 언어별 네이티브 지원

코루틴은 어셈블리어 메소드로 기원하였으나, 일부 고급 프로그래밍 언어에서도 지원된다. 초기 예시로는 시뮬라[64], 스몰토크, 모듈라-2가 있다. 최근에는 루비, 루아, 줄리아, Go 등에서도 지원된다.

다음은 코루틴을 네이티브로 지원하는 프로그래밍 언어 목록이다.

언어비고
아이키도
엔젤스크립트
발레리나
BCPL
파스칼Turbo Pascal 7.0 (uThreads 모듈 포함)
BETA
BLISS
C++C++20부터
C#2.0부터
채플
CLU
D
다이나믹 C
얼랭
F#
팩터
게임몽키 스크립트
GDScript고도 게임 엔진의 스크립트 언어
하스켈[65][66]
고수준 어셈블리[67]
아이콘
아이오
자바스크립트1.7부터 (ECMAScript 6에서 표준화됨), ECMAScript 2017은 await 지원 포함.
줄리아[69]
코틀린1.1부터[70]
림보
루아[71]
루시드
μC++
모듈라-2
네머를
펄 5[https://metacpan.org/pod/Coro Coro 모듈] 사용
PHP[https://github.com/facebook/hiphop-php HipHop] 사용, PHP 5.5부터 네이티브 지원
피코리스프
프롤로그
파이썬2.5부터,[72] 3.3부터 개선 지원, 3.5부터 명시적 문법 지원[73]
라켓(프로그래밍 언어)
라쿠[74]
루비
세서
스키마
셀프
시뮬라
스몰토크
스쿼럴
스택리스 파이썬
슈퍼콜라이더[75]
Tcl8.6 이후
urbiscript


6. 구현

코루틴은 스레드와 매우 비슷하지만, 스레드가 일반적으로 선점형 멀티태스킹 방식으로 동작하는 반면 코루틴은 협력적 멀티태스킹 방식으로 동작한다.[18] 코루틴은 작업 순서를 변경할 수 있게 하여 동시성을 제공하지만, 여러 작업을 동시에 실행하지 않으므로 병렬성은 제공하지 않는다.

코루틴이 스레드보다 가지는 장점은 다음과 같다.


  • 하드 실시간 환경에서 사용할 수 있다.
  • 스위칭 시 시스템 호출이나 블로킹 호출이 필요하지 않다.
  • 임계 구역 보호를 위해 뮤텍스나 세마포어 같은 동기화 장치가 필요하지 않다.
  • 운영 체제의 지원이 필요하지 않다.


선점형 스레드를 사용하여 코루틴을 구현할 수도 있지만, 이 경우 하드 실시간 작동에 적합하고 스위칭 비용이 저렴하다는 장점은 사라진다.

C 및 C++를 포함한 많은 프로그래밍 언어는 언어나 표준 라이브러리에서 코루틴을 직접 지원하지 않는다. 이는 스택 기반 서브루틴 구현의 제한 때문이다. 예외적으로 POSIX, Mac OS X, Windows에서 ARM, MIPS, PowerPC, SPARC, x86에 대한 컨텍스트 스와핑을 지원하는 [http://www.boost.org/doc/libs/1_55_0/libs/context/doc/html/index.html Boost.Context] C++ 라이브러리가 있으며, 이는 [http://www.boost.org 부스트 라이브러리]의 일부이다. Boost.Context를 기반으로 코루틴을 구축할 수 있다.

코루틴을 사용할 수 없는 경우, 일반적인 해결 방법은 클로저와 상태 변수(정적 변수, 주로 부울 플래그)를 사용하여 호출 간 내부 상태를 유지하고 제어를 올바른 지점으로 전송하는 서브루틴을 사용하는 것이다. 또는 switch 문이나 goto 문을 사용하여 명시적인 상태 머신을 구현하는 방법도 있다. 그러나 이러한 구현은 유지보수가 어렵다는 단점이 있으며, 이는 코루틴 지원의 필요성을 보여준다.

현재 주류 프로그래밍 환경에서 스레드파이버가 코루틴의 대안으로 사용된다. 스레드는 ''동시에'' 실행되는 코드 조각의 상호 작용을 관리하는 기능을 제공하며, C를 지원하는 환경에서 널리 사용되고 잘 구현되어 있다. 그러나 스레드는 복잡한 기능을 많이 포함하고 있어 학습 곡선이 높다. 따라서 코루틴만 필요한 경우에는 스레드 사용이 과도할 수 있다.

스레드와 코루틴의 주요 차이점 중 하나는 스레드는 선점형으로, 코루틴은 협력형으로 예약된다는 점이다. 스레드는 언제든지 재예약될 수 있고 동시에 실행될 수 있으므로 에 주의해야 한다. 반면 코루틴은 프로그램의 특정 지점에서만 재예약되고 동시에 실행되지 않으므로 락을 피할 수 있다.

파이버는 협력적으로 예약되므로 코루틴 구현에 이상적이지만,[18] 스레드에 비해 시스템 지원이 부족한 경우가 많다.

일반적인 목적의 코루틴을 구현하려면 두 번째 콜 스택이 필요하며, 이는 C 언어에서 직접 지원하지 않는 기능이다. 이를 위해 인라인 어셈블리를 사용하여 코루틴 생성 시 스택 포인터를 조작하는 방법이 톰 더프에 의해 제안되었다.[19] POSIX sigaltstack 시스템 호출을 제공하는 플랫폼에서는 신호 처리기 내에서 스프링보드 함수를 호출하여 두 번째 콜 스택을 확보할 수 있다.[20][21] POSIX 또는 단일 유닉스 규격 (SUSv3)을 준수하는 C 라이브러리는 getcontext, setcontext, makecontext, swapcontext와 같은 루틴을 제공했지만, POSIX 1.2008에서 더 이상 사용되지 않는다.[22]

두 번째 콜 스택을 확보한 후에는 표준 C 라이브러리의 setjmp 및 longjmp 함수를 사용하여 코루틴 간 전환을 구현할 수 있다. 이 함수들은 스택 포인터, 프로그램 카운터, 콜리-저장 레지스터 등을 저장하고 복원한다. 더 빠른 구현을 위해 인라인 어셈블리를 사용하여 스택 포인터와 프로그램 카운터만 교환하는 방법도 있다.

많은 저자들이 코루틴용 자체 라이브러리를 작성했다. 러스 콕스의 libtask 라이브러리[23]가 대표적인 예시이다. 다른 구현으로는 libpcl,[24] coro,[25] lthread,[26] libCoroutine,[27] libconcurrency,[28] libcoro,[29] ribs2,[30] libdill.,[31] libaco,[32] 및 libco.[21]가 있다.

서브루틴과 매크로를 조합하여 C에서 코루틴을 구현하려는 시도도 있었다. 사이먼 타탐의 기여[33]는 더프의 장치를 기반으로 하며, Protothread와 유사한 구현의 기반이 되었다.[34] 그러나 이 방식은 각 코루틴에 대한 별도의 스택 프레임을 유지하지 않아 지역 변수가 보존되지 않는 등의 한계가 있다.[19]

C++20은 실행 중간에 일시 중단했다가 나중에 다시 시작할 수 있는 스택리스 함수로서 표준화된 코루틴을 도입했다. 코루틴의 중단된 상태는 힙에 저장된다.[35] G++ 및 MSVC 컴파일러는 최신 버전에서 표준 코루틴을 완벽하게 지원한다.[36]

C++ 코루틴 관련 라이브러리는 다음과 같다.

  • [https://github.com/David-Haim/concurrencpp concurrencpp] - C++20 코루틴에 대한 타사 지원을 제공하는 C++20 라이브러리이다.
  • [http://www.boost.org/doc/libs/1_57_0/libs/coroutine/doc/html/index.html Boost.Coroutine] - Oliver Kowalke가 제작했으며, 버전 1.53 이후 [http://boost.org boost]의 공식 출시된 이식 가능한 코루틴 라이브러리이다.
  • [http://www.boost.org/doc/libs/1_61_0/libs/coroutine2/doc/html/index.html Boost.Coroutine2] - 역시 Oliver Kowalke가 제작했으며, 부스트 버전 1.59 이후 현대화된 이식 가능한 코루틴 라이브러리이다.
  • [https://github.com/mozy/mordor Mordor] - 2010년, Mozy는 비동기 I/O를 더 친숙한 순차적 모델로 추상화하는 데 중점을 둔 코루틴을 구현하는 C++ 라이브러리를 오픈 소스로 공개했다.[37]
  • [https://github.com/jamboree/co2 CO2] - C++ 전처리기 트릭을 기반으로 하는 스택리스 코루틴이다.
  • [https://github.com/scummvm/scummvm/blob/master/common/coroutines.h ScummVM] - ScummVM 프로젝트는 [http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html Simon Tatham의 기사]를 기반으로 하는 가벼운 버전의 스택리스 코루틴을 구현한다.
  • [https://github.com/tonbit/coroutine tonbit::coroutine] - ucontext / fiber를 통한 C++11 단일 .h 비대칭 코루틴 구현
  • 코루틴은 2017년 5월에 Clang에 도입되었으며, libc++ 구현이 진행 중이다.[38]
  • [https://github.com/infinit/elle elle] by Docker
  • [https://oatpp.io/docs/oatpp-coroutines/ oatpp-coroutines] - 높은 동시성 수준의 I/O 작업을 위해 설계된 스케줄링이 있는 스택리스 코루틴. Oat++의 [https://oatpp.io/benchmark/websocket/5-million/ 5백만 WebSocket 연결] 실험에 사용되었다. [https://github.com/oatpp/oatpp Oat++] 웹 프레임워크의 일부이다.

참조

[1] 웹사이트 How the heck does async/await work in Python 3.5? https://snarky.ca/ho[...] 2023-01-10
[2] 서적 Coroutines: A Programming Methodology, a Language Design and an Implementation Springer 1980
[3] 논문 Revisiting Coroutines
[4] 서적 Encyclopedia of computer science https://books.google[...] Nature Pub. Group 2013-05-11
[5] 문서 The Python Language Reference https://docs.python.[...]
[6] 웹사이트 Coroutine: Type-safe coroutines using lightweight session types http://hackage.haske[...]
[7] 웹사이트 Co-routines in Haskell https://axman6.com/p[...]
[8] 웹사이트 The Coroutines Module (coroutines.hhf) http://www.plantatio[...]
[9] 웹사이트 New in JavaScript 1.7 https://developer.mo[...] 2018-06-18
[10] 웹사이트 Julia Manual - Control Flow - Tasks (aka Coroutines) https://docs.juliala[...]
[11] 웹사이트 What's New in Kotlin 1.1 https://kotlinlang.o[...]
[12] 웹사이트 Lua 5.2 Reference Manual http://www.lua.org/m[...]
[13] 웹사이트 Python async/await Tutorial https://stackabuse.c[...] 2015-12-17
[14] 웹사이트 8. Compound statements — Python 3.8.0 documentation https://docs.python.[...]
[15] 웹사이트 Gather and/or Coroutines https://perl6advent.[...] 2012-12-19
[16] 서적 Structured Programming Academic Press
[17] 논문 Rethinking the Computer Music Programming Language: SuperCollider http://portal.acm.or[...] MIT Press
[18] 웹사이트 Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API http://msdn.microsof[...]
[19] 웹사이트 Coroutines in C – brainwagon https://brainwagon.o[...] 2005-03-05
[20] 논문 Portable Multithreading – The Signal Stack Trick For User-Space Thread Creation https://www.gnu.org/[...] 2000-06-18
[21] 웹사이트 libco https://code.byuu.or[...] 2022-03-01 #Dead link date
[22] 웹사이트 getcontext(3) - Linux manual page http://man7.org/linu[...]
[23] 웹사이트 Russ Cox's libtask coroutine library http://swtch.com/lib[...]
[24] 웹사이트 Portable Coroutine Library http://xmailserver.o[...]
[25] 웹사이트 Edgar Toernig's coro library http://www.goron.de/[...]
[26] 웹사이트 lthread https://github.com/h[...]
[27] 웹사이트 libcoroutine: A portable coroutine implementation http://dekorte.com/p[...] 2013-09-06
[28] 웹사이트 libconcurrency - A scalable concurrency library for C http://code.google.c[...]
[29] 웹사이트 libcoro: C-library that implements coroutines (cooperative multitasking) in a portable fashion http://software.schm[...]
[30] 웹사이트 RIBS (Robust Infrastructure for Backend Systems) version 2: aolarchive/ribs2 https://github.com/a[...] 2019-08-13
[31] 웹사이트 libdill http://libdill.org/ 2019-10-21
[32] 웹사이트 A blazing fast and lightweight C asymmetric coroutine library 💎 ⛅🚀⛅🌞: hnes/libaco https://github.com/h[...] 2019-10-21
[33] 웹사이트 Coroutines in C http://www.chiark.gr[...]
[34] 웹사이트 Stackless coroutine implementation in C and C++: jsseldenthuis/coroutine https://github.com/j[...] 2019-03-18
[35] 문서 Technical specification for coroutines http://www.open-std.[...]
[36] 웹사이트 Current compiler support for standard coroutines https://en.cpprefere[...]
[37] 웹사이트 Open Source and Mozy: The Debut of Mozy Code http://mozy.com/blog[...]
[38] 트위터 Coroutines are now in Clang Trunk! Working on the Libc++ implementation now. https://twitter.com/[...]
[39] 웹사이트 Iterators https://learn.micros[...] Microsoft 2021-11-11
[40] 웹사이트 The history of C# https://learn.micros[...] Microsoft 2023-02-13
[41] 웹사이트 Goroutines - Effective Go https://go.dev/doc/e[...] 2022-11-28
[42] 웹사이트 Go statements - The Go Specification https://go.dev/ref/s[...] 2022-11-28
[43] 웹사이트 Goroutines - A Tour of Go https://go.dev/tour/[...] 2022-11-28
[44] 웹사이트 Frequently Asked Questions (FAQ) - The Go Programming Language https://go.dev/doc/f[...]
[45] 웹사이트 Coroutines for Go https://research.swt[...] 2024-10-24
[46] 간행물 JVM Continuations http://www.wiki.jvml[...]
[47] 웹사이트 Holy crap: JVM has coroutine/continuation/fiber etc. http://weblogs.java.[...] 2009-11-19
[48] 웹사이트 ECMAScript 6: New Features: Overview and Comparison - Generator Function Iterator Protocol https://es6-features[...] 2018-03-19
[49] 웹사이트 Lua version history http://www.lua.org/v[...]
[50] 웹사이트 Coroutines in Lua http://www.lua.org/d[...] 2023-04-24
[51] 저널 Coroutines in Lua 2004
[52] 웹사이트 Mono Continuations http://www.mono-proj[...]
[53] 블로그 http://blogs.msdn.co[...]
[54] 웹사이트 Fiber mode is gone... https://docs.microso[...] 2021-06-08
[55] 웹사이트 The threads library https://v2.ocaml.org[...]
[56] 웹사이트 RFC #31 http://www.perl6.org[...]
[57] 웹사이트 What's New in Python 3.7 https://docs.python.[...] 2021-09-10
[58] 웹사이트 semi-coroutines http://www.ruby-foru[...]
[59] 웹사이트 coroutine manual page - Tcl Built-In Commands https://www.tcl.tk/m[...] Tcl.tk 2016-06-27
[60] 논문 Design of a separable transition-diagram compiler 1963-07
[61] 서적 The Art of Computer programming
[62] 서적 Fundamental Algorithms Addison-Wesley
[63] 저널 Design of a Separable Transition-Diagram Compiler 1963-07
[64] 서적 Structured Programming Academic Press
[65] 웹인용 Coroutine: Type-safe coroutines using lightweight session types http://hackage.haske[...]
[66] 웹인용 Co-routines in Haskell https://axman6.com/p[...]
[67] 웹인용 The Coroutines Module (coroutines.hhf) http://www.plantatio[...]
[68] 웹인용 New in JavaScript 1.7 https://developer.mo[...] 2020-06-18
[69] 웹인용 Julia Manual - Control Flow - Tasks (aka Coroutines) http://docs.julialan[...] 2020-06-18
[70] 웹인용 What's New in Kotlin 1.1 https://kotlinlang.o[...]
[71] 웹인용 Lua 5.2 Reference Manual http://www.lua.org/m[...]
[72] 웹인용 Python async/await Tutorial https://stackabuse.c[...] 2015-12-17
[73] 웹인용 8. Compound statements — Python 3.8.0 documentation https://docs.python.[...]
[74] 웹인용 Gather and/or Coroutines https://perl6advent.[...] 2012-12-19
[75] 논문 Rethinking the Computer Music Programming Language: SuperCollider http://portal.acm.or[...] MIT Press 2002



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com