Boost.Fiber when_any, produce first success


when_any, produce first success - 첫 번째 성공을 생성

"when_any" 기능에 대한 한 가지 시나리오는 신뢰할 수 없는 일부 웹 서비스에 중복적으로 접속하는 경우입니다.   속도가 느릴 뿐만 아니라 어느 하나라도 원하는 결과가 아닌 실패가 발생할 수 있습니다.

이러한 경우 wait_first_outcome()은 올바른 접근 방식이 아닙니다.   서비스 중 하나에서 빠르게 오류가 발생하고 다른 서비스에서 실제 답변이 나오는 경우, 오류가 먼저 도착했다는 이유만으로 오류를 선호하고 싶지는 않습니다.

하지만 wait_first_outcome()에 대해 이미 생성한 대기열< future< T > >을 고려하면 첫 번째 성공적인 결과를 전달하기 위해 인터페이스 함수를 쉽게 다시 캐스팅할 수 있습니다.

그렇다면 질문이 생깁니다. 모든 작업 함수가 예외를 발생시키면 어떻게 될까요?   그렇다면 우리는 그것에 대해 더 잘 알 것입니다.

C++ 병렬 처리 초안 기술 사양에서는 std::exception_ptrs 컬렉션을 전달할 수 있는 std::exception_list 예외를 제안합니다.   이것이 보편적으로 사용 가능해질 때까지 우리만의 'exception_list(예외 목록)'을 만들어 보겠습니다. 이제 wait_first_outcome_impl()을 사용하여 wait_first_success()를 빌드할 수 있습니다.

대기열에서 첫 번째 future<>만 검색하는 대신 이제 future<> 항목을 반복해야 합니다.   물론 우리는 그 반복을 제한해야 합니다!   카운트 생산자 파이버만 실행하면 (count+1)번째 buffered_channel::pop() 호출이 영원히 차단됩니다.

준비된 future<>가 주어지면 future::get_exception_ptr()을 호출하여 실패를 구별할 수 있습니다.   실제로 future<>에 예외가 아닌 결과가 포함되어 있으면 get_exception_ptr()은 nullptr을 반환합니다.   이 경우에는 future::get()을 자신있게 호출하여 해당 결과를 호출자에게 반환할 수 있습니다.

그러나 'std::exception_ptr'이 nullptr이 아니면 이를 보류 중인 예외 목록에 수집하고 큐에서 다음 future<>를 위해 루프백합니다.

루프에서 벗어나면(모든 단일 작업 파이버가 예외를 발생시키는 경우) 'std::exception_ptrs'를 수집했던 'exception_list' 예외를 발생시킵니다. 호출은 다음과 같습니다.

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

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