bfiber_0900
Boost.Fiber Integrating Fibers with Nonblocking I/O
Integrating Fibers with Nonblocking I/O
비차단 I/O와 파이버 통합
📦 Overview - 개요
비차단 I/O는 비동기 I/O와 다릅니다.
진정한 비동기 I/O 작업은 일반적으로 일종의 콜백(비동기 콜백과 파이버 통합에 설명된 대로)을 통해 작업을 시작하고 완료 시 호출자에게 알립니다.
대조적으로, 비차단 I/O 작업은 차단이 필요한 경우 전혀 시작을 거부하고 'EWOULDBLOCK'과 같은 오류 코드를 반환합니다.
작업은 즉시 완료될 수 있는 경우에만 수행됩니다.
실제로 호출자는 'EWOULDBLOCK' 반환을 중지할 때까지 작업을 반복적으로 다시 시도해야 합니다.
전통적인 이벤트 중심 프로그램에서는 비차단 I/O를 사용하는 것이 골치 아픈 일이 될 수 있습니다.
비차단 I/O가 시도되는 지점에서 'EWOULDBLOCK'의 반환 값은 호출자가 제어를 메인 이벤트 루프로 다시 전달하여 다음 반복에서 다시 시도하도록 요구합니다.
더 나쁜 것은 비차단 I/O 작업이 부분적으로 성공할 수도 있다는 것입니다.
이는 필요한 모든 데이터가 처리될 때까지 관련 비즈니스 로직이 모든 메인 루프 반복에 대한 제어를 계속 수신해야 함을 의미합니다.
콜백 기반 상태 머신(callback-driven state machine)으로 구현된 이중 중첩 루프(doubly-nested loop)입니다.
Boost.Fiber는 이 문제를 엄청나게 단순화할 수 있습니다.
다른 메인 루프와 스레드 공유에 설명된 대로 응용 프로그램의 메인 루프와 통합되면 다음 메인 루프(main-loop) 반복을 기다리는 것은 this_fiber::yield()를 호출하는 것만큼 간단합니다.
📦 Example Nonblocking API
설명을 위해 다음 API를 고려해보세요.
📦 Polling for Completion - 완료를 위한 폴링(반복 확인)
호출자가 'EWOULDBLOCK'을 처리하지 못하도록 보호하는 NonblockingAPI::read() 주위에 낮은 수준 래퍼를 구축할 수 있습니다.
📦 Filling All Desired Data - 원하는 모든 데이터 채우기
read_chunk()가 주어지면 원하는 데이터가 모두 나올 때까지 간단하게 반복할 수 있습니다. (물론 문자열 데이터를 축적하는 더 효율적인 방법이 있습니다. 이것이 이 예제의 요점은 아닙니다.)
📦 Wrapping it Up - 마무리
마지막으로 관련 예외를 정의할 수 있습니다.
원하는 모든 데이터를 반환하거나 'IncompleteRead'를 발생시키는 간단한 read() 함수를 작성합니다.
this_fiber::yield()를 사용하여 다음 메인 루프 반복을 투명하게 기다릴 수 있으면 일반 캡슐화가 제대로 작동합니다.
위의 소스 코드는 'adapt_nonblocking.cpp'에 있습니다.
-> https://www.boost.org/doc/libs/1_85_0/libs/fiber/examples/adapt_nonblocking.cpp