방법: 데이터 파이프라인에서 transformer 사용How to: Use transformer in a Data Pipeline

이 항목에는 데이터 파이프라인에서 concurrency:: 변환기 클래스를 사용 하는 방법을 보여 주는 기본 예제가 포함 되어 있습니다.This topic contains a basic example that shows how to use the concurrency::transformer class in a data pipeline. 데이터 파이프라인을 사용 하 여 이미지 처리를 수행 하는 전체 예제는 연습: 이미지 처리 네트워크 만들기를 참조 하세요.For a more complete example that uses a data pipeline to perform image processing, see Walkthrough: Creating an Image-Processing Network.

데이터 파이프라인 은 동시 프로그래밍의 일반적인 패턴입니다.Data pipelining is a common pattern in concurrent programming. 데이터 파이프라인은 일련의 단계로 구성 되며, 각 단계는 작업을 수행 하 고 해당 작업의 결과를 다음 단계로 전달 합니다.A data pipeline consists of a series of stages, where each stage performs work and then passes the result of that work to the next stage. transformer클래스는 입력 값을 받고 해당 값에 대해 작업을 수행한 다음 사용할 다른 구성 요소에 대 한 결과를 생성 하기 때문에 데이터 파이프라인의 핵심 구성 요소입니다.The transformer class a key component in data pipelines because it receives an input value, performs work on that value, and then produces a result for another component to use.

예제Example

이 예제에서는 다음 데이터 파이프라인을 사용 하 여 초기 입력 값이 지정 된 일련의 변환을 수행 합니다.This example uses the following data pipeline to perform a series of transformations given an initial input value:

  1. 첫 번째 단계는 해당 입력의 절대값을 계산 합니다.The first stage calculates the absolute value of its input.

  2. 두 번째 단계는 해당 입력의 제곱근을 계산 합니다.The second stage calculates the square root of its input.

  3. 세 번째 단계는 해당 입력의 제곱을 계산 합니다.The third stage computes the square of its input.

  4. 단계는 해당 입력을 부정 합니다.The forth stage negates its input.

  5. 다섯 번째 단계는 최종 결과를 메시지 버퍼에 기록 합니다.The fifth stage writes the final result to a message buffer.

마지막으로 파이프라인의 결과를 콘솔에 출력 합니다.Finally, the example prints the result of the pipeline to the console.

// data-pipeline.cpp
// compile with: /EHsc
#include <agents.h>
#include <math.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Computes the absolute value of its input.
   transformer<int, int> t0([](int n) {
      return abs(n);
   });

   // Computes the square root of its input.
   transformer<int, double> t1([](int n) {
      return sqrt(static_cast<double>(n));
   });

   // Computes the square its input.
   transformer<double, int> t2([](double n) {
      return static_cast<int>(n * n);
   });

   // Negates its input.
   transformer<int, int> t3([](int n) {
      return -n;
   });

   // Holds the result of the pipeline computation.
   single_assignment<int> result;

   // Link together each stage of the pipeline.
   // t0 -> t1 -> t2 -> t3 -> result
   t0.link_target(&t1);
   t1.link_target(&t2);
   t2.link_target(&t3);
   t3.link_target(&result);

   // Propagate a message through the pipeline.
   send(t0, -42);

   // Print the result to the console.
   wcout << L"The result is " << receive(result) << L'.' << endl;
}

이 예제는 다음과 같은 출력을 생성합니다.This example produces the following output:

The result is -42.

데이터 파이프라인의 단계에서 형식이 입력 값과 다른 값을 출력 하는 것이 일반적입니다.It is common for a stage in a data pipeline to output a value whose type differs from its input value. 이 예제에서 두 번째 단계는 형식의 값을 int 입력으로 사용 하 고 해당 값 (a)의 제곱근을 double 출력으로 생성 합니다.In this example, the second stage takes a value of type int as its input and produces the square root of that value (a double) as its output.

참고

이 예제의 데이터 파이프라인은 설명을 위한 것입니다.The data pipeline in this example is for illustration. 각 변환 작업은 거의 작업을 수행 하지 않으므로 메시지 전달을 수행 하는 데 필요한 오버 헤드는 데이터 파이프라인을 사용 하는 경우의 이점 보다 클 수 있습니다.Because each transformation operation performs little work, the overhead that is required to perform message-passing can outweigh the benefits of using a data pipeline.

코드 컴파일Compiling the Code

예제 코드를 복사 하 여 Visual Studio 프로젝트에 붙여넣거나 라는 파일에 붙여 넣은 data-pipeline.cpp 후 Visual Studio 명령 프롬프트 창에서 다음 명령을 실행 합니다.Copy the example code and paste it in a Visual Studio project, or paste it in a file that is named data-pipeline.cpp and then run the following command in a Visual Studio Command Prompt window.

cl.exe/EHsc data-pipelinecl.exe /EHsc data-pipeline.cpp

참고 항목See also

비동기 에이전트 라이브러리Asynchronous Agents Library
비동기 메시지 블록Asynchronous Message Blocks
연습: 이미지 처리 네트워크 만들기Walkthrough: Creating an Image-Processing Network