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

⚛ 원문
Email 답글이 올라오면 이메일로 알려드리겠습니다.

혹시 처음이세요?
레디스게이트에는 레디스에 대한 많은 정보가 있습니다.
레디스 소개, 명령어, SQL, 클라이언트, 서버, 센티널, 클러스터 등이 있습니다.
혹시 필요한 정보를 찾기 어려우시면 redisgate@gmail.com로 메일 주세요.
제가 찾아서 알려드리겠습니다.
 
close
IP를 기반으로 보여집니다.