코-루틴 TS 지원 (Coroutines TS Support)
코-루틴 TS에 대한 지원은 awaitable 클래스 템플릿, use_awaitable 완료 토큰 그리고 co_spawn() 함수를 통해서 제공된다. 이런 기능으로 프로그램은 다음 예제와 같이 co_await 키워드와 함께 동기식 방식으로 비동기식 로직을 구현할 수 있다:
boost::asio::co_spawn(executor, echo(std::move(socket)), boost::asio::detached); // ... boost::asio::awaitable<void> echo(tcp::socket socket) { try { char data[1024]; for (;;) { std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), boost::asio::use_awaitable); co_await async_write(socket, boost::asio::buffer(data, n), boost::asio::use_awaitable); } } catch (std::exception& e) { std::printf("echo Exception: %s\n", e.what()); } }
co_spawn()에 첫 번째 인수는 코-루틴이 실행될 수 있는 컨텍스트를 결정하는 실행기(executor)다. 예를 들어, 서버의 클라이언트별 개체는 여러 코-루틴으로 구성될 수 있고, 코-루틴은 동일한 스트랜드(strand)에서 실행되어야 하기에 명시적인 동기화가 필요하지 않다.
두 번째 인수는 코-루틴의 진입점 함수(entry point function)의 결과인 awaitable<R>이고, 위의 예제에서 echo 호출의 결과이다. (또는 이 인수는 awaitable<R>을 반환하는 함수 객체일 수도 있다.) 템플릿 파라미터 R은 코-루틴에서 생성된 반환 값의 유형이다. 위의 예에서 코-루틴은 void를 반환한다.
세 번째 인수는 완료 토큰이고, co_spawn()에서 void(std::exception_ptr, R) 서명으로 완료 핸들러를 생성하는데 사용한다. 이 완료 핸들러는 코-루틴이 완료되면 코-루틴의 결과와 함께 호출된다. 위의 예에서는 비동기식 작업의 결과를 명시적으로 무시하는 데 사용되는 완료 토큰 유형인 boost::asio::detached를 전달한다.
이 예에서 코-루틴의 본문은 echo 함수로 구현된다. use_awaitable 완료 토큰이 비동기식 작업에 전달될 때, 작업의 개시 함수가 co_wait 키워드와 함께 사용할 수 있는 awaitable을 반환한다:
std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), boost::asio::use_awaitable);
비동기식 작업의 핸들러 서명은 다음과 같은 형식이다:
void handler(boost::system::error_code ec, result_type result);
co_await 표현식의 결과 유형은 result_type이다. 위의 async_read_some 예제에서 이것은 size_t이다. 비동기식 작업이 실패하면 error_code가 system_error 예외로 변환되어 전달(throw)된다.
핸들러 서명 형식은 다음과 같다:
void handler(boost::system::error_code ec);
co_await 표현식은 void 결과를 생성한다. 위와 같은 오류는 system_error 예외로서 코-루틴에 다시 전달된다.
더 보기
co_spawn, detached, redirect_error, awaitable, use_awaitable_t, use_awaitable, this_coro::executor, Coroutines TS examples, Stackful Coroutines, Stackless Coroutines.
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - 네트워킹 - TCP, UDP 및 ICMP (0) | 2020.12.10 |
---|---|
Boost.Asio 개요 - 네트워킹 (0) | 2020.12.10 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 스택형 코-루틴 (0) | 2020.12.10 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 스택리스 코-루틴 (0) | 2020.12.09 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 동시성 힌트 (0) | 2020.12.09 |