스택형 코-루틴 (Stackful Coroutines)
spawn() 함수는 스택형 코-루틴을 실행하기 위한 고수준 래퍼이다. 그것은 Boost.Coroutine 라이브러리를 기반으로 한다. spawn() 함수는 다음 예와 같이 프로그램이 동기식 방식으로 비동기식 로직을 구현할 수 있도록 한다:
boost::asio::spawn(my_strand, do_echo); // ... void do_echo(boost::asio::yield_context yield) { try { char data[128]; for (;;) { std::size_t length = my_socket.async_read_some( boost::asio::buffer(data), yield); boost::asio::async_write(my_socket, boost::asio::buffer(data, length), yield); } } catch (std::exception& e) { // ... } }
spawn()의 첫 번째 인수는 io_context::strand, io_context 또는 완료 핸들러(completion handler)일 수 있다. 이 인수는 코-루틴이 실행할 수 있는 컨텍스트를 결정한다. 예를 들어, 서버의 클라이언트별 개체는 여러 코-루틴으로 구성될 수 있고, 코-루틴은 동일한 스트랜드(strand)에서 실행되어야 하기에 명시적인 동기화가 필요하지 않다.
두 번째 인수는 다음과 같이 서명이 있는 함수 개체이다:
void coroutine(boost::asio::yield_context yield);
코-루틴의 일부로 실행할 코드를 지정한다. yield 파라미터는 다음과 같이 완료 핸들러 대신 비동기 작업에 전달될 수 있다:
std::size_t length = my_socket.async_read_some( boost::asio::buffer(data), yield);
이렇게 하면 비동기 작업이 시작되고, 코-루틴은 일시 중단된다. 비동기 작업이 완료되면 코-루틴은 자동으로 다시 시작된다.
비동기 작업의 핸들러 서명은 다음과 같은 형식을 갖는다:
void handler(boost::system::error_code ec, result_type result);
개시 함수는 result_type을 반환한다. 위에 async_read_some 예제에서 이것은 size_t 이다. 비동기 작업이 실패하면 error_code가 system_error 예외로 변환되어 전달(throw)된다.
핸들러 서명의 형식은 다음과 같다:
void handler(boost::system::error_code ec);
개시 함수는 void를 반환한다. 위와 같이 오류는 system_error 예외로 코-루틴에 다시 전달된다.
예외를 발생시키지 않고 작업에서 error_code를 수집하려면, 다음과 같이 출력 변수를 yield_context와 연결한다:
boost::system::error_code ec; std::size_t length = my_socket.async_read_some( boost::asio::buffer(data), yield[ec]);
주의: spawn()이 Handler 유형의 사용자 완료 핸들러와 함께 사용되면, 함수 객체 서명은 실제로 다음과 같다:
void coroutine(boost::asio::basic_yield_context<Handler> yield);
더 보기
spawn, yield_context, basic_yield_context, Spawn example (C++03), Spawn example (C++11), Stackless Coroutines.
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - 네트워킹 (0) | 2020.12.10 |
---|---|
Boost.Asio 개요 - 핵심 개념 및 기능 - 코-루틴 TS 지원 (0) | 2020.12.10 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 스택리스 코-루틴 (0) | 2020.12.09 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 동시성 힌트 (0) | 2020.12.09 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 핸들러 추적 (0) | 2020.12.09 |