비동기 에이전트 라이브러리Asynchronous Agents Library

비동기 에이전트 라이브러리 (또는 그냥 에이전트 라이브러리) 동시성 사용 응용 프로그램 개발의 견고성을 향상 시킬 수 있는 프로그래밍 모델을 제공 합니다.The Asynchronous Agents Library (or just Agents Library) provides a programming model that lets you increase the robustness of concurrency-enabled application development. 에이전트 라이브러리는는 C++ 템플릿 라이브러리는 행위자 기반 프로그래밍 모델 및 정교 하지 않은 데이터 흐름에 대 한 전달 및 파이프라인 작업을 위해 in-process 메시지입니다.The Agents Library is a C++ template library that promotes an actor-based programming model and in-process message passing for coarse-grained dataflow and pipelining tasks. 에이전트 라이브러리는 동시성 런타임의 예약 및 리소스 관리 구성 요소 기반으로 합니다.The Agents Library builds on the scheduling and resource management components of the Concurrency Runtime.

프로그래밍 모델Programming Model

에이전트 라이브러리에서는 제어 흐름의 데이터 흐름을 기반으로 하는 비동기 통신 모델을 통해 격리 된 구성 요소를 연결할 수 있도록 하 여 공유 상태에 대 한 대안을 제공 합니다.The Agents Library provides alternatives to shared state by letting you connect isolated components through an asynchronous communication model that is based on dataflow instead of control flow. 데이터 흐름 프로그래밍 참조 데이터를 필요한 모든 계산에 적용 됩니다 모델은 사용할 수 있습니다. 제어 흐름 미리 결정 된 순서로 계산 수행 되는 프로그래밍 모델을 가리킵니다.Dataflow refers to a programming model where computations are made when all required data is available; control flow refers to a programming model where computations are made in a predetermined order.

데이터 흐름 프로그래밍 모델은 프로그램의 개별 구성 요소가 메시지를 전달하여 서로 통신하는 메시지 전달 개념과 관련됩니다.The dataflow programming model is related to the concept of message passing, where independent components of a program communicate with one another by sending messages.

에이전트 라이브러리는 세 가지 구성 요소로 구성: 비동기 에이전트하십시오 비동기 메시지 블록, 및 메시지 전달 함수합니다.The Agents Library is composed of three components: asynchronous agents, asynchronous message blocks, and message-passing functions. 에이전트 상태를 유지 관리 하 고 메시지 블록 및 메시지 전달 함수를 사용 하 여 외부 구성 요소와 서로 통신 하도록 합니다.Agents maintain state, and use message blocks and message-passing functions to communicate with one another and with external components. 메시지 전달 함수는 외부 구성 요소에서 메시지를 수신 하는 에이전트를 사용 합니다.Message-passing functions enable agents to send and receive messages to and from the external components. 비동기 메시지 블록 메시지를 보관 하 고 동기화 된 방식으로 통신 하도록 에이전트를 사용 하도록 설정 합니다.Asynchronous message blocks hold messages and enable agents to communicate in a synchronized manner.

다음 그림에서는 사용 하 여 메시지 블록 및 전달할 메시지 전달 함수 두 에이전트를 보여 줍니다.The following illustration shows how two agents use message blocks and message-passing functions to communicate. 이 그림과 agent1 메시지를 보내는 agent2 사용 하 여 합니다 concurrency:: send 함수 및 concurrency:: unbounded_buffer 개체입니다.In this illustration, agent1 sends a message to agent2 by using the concurrency::send function and a concurrency::unbounded_buffer object. agent2 사용 하는 concurrency:: receive 메시지를 읽는 함수입니다.agent2 uses the concurrency::receive function to read the message. agent2 동일한 메서드를 사용 하 여 메시지를 보내는 agent1합니다.agent2 uses the same method to send a message to agent1. 점선으로 된 화살표에는 에이전트 간의 데이터 흐름을을 나타냅니다.Dashed arrows represent the flow of data between agents. 실선 화살표에서 읽기 또는 쓰기에 해당 하는 메시지 블록에 에이전트를 연결 합니다.Solid arrows connect the agents to the message blocks that they write to or read from.

에이전트 라이브러리의 구성 요소The components of the Agents Library

이 그림에서는 구현 하는 코드 예제는이 항목의 뒷부분에 표시 됩니다.A code example that implements this illustration is shown later in this topic.

에이전트 프로그래밍 모델에 다른 동시성 및 동기화 메커니즘, 예를 들어, 이벤트를 통해 여러 장점이 있습니다.The agent programming model has several advantages over other concurrency and synchronization mechanisms, for example, events. 장점은 개체 간의 상태 변경 내용을 전송할 메시지 전달을 사용 하면 공유 리소스에 대 한 액세스를 격리 하 고 수 있는 확장성을 향상 시키는입니다.One advantage is that by using message passing to transmit state changes between objects, you can isolate access to shared resources, and thereby improve scalability. 메시지 전달에 장점은 외부 동기화 개체에 연결 하는 대신 데이터 동기화와 연결 한다는 점입니다.An advantage to message passing is that it ties synchronization to data instead of tying it to an external synchronization object. 이 구성 요소 간의 데이터 전송을 간소화 하 고 응용 프로그램에서 프로그래밍 오류를 제거할 수 있습니다.This simplifies data transmission among components and can eliminate programming errors in your applications.

에이전트 라이브러리를 사용 하는 경우When to Use the Agents Library

비동기적으로 서로 통신 해야 하는 여러 작업 해야 하는 경우 에이전트 라이브러리를 사용 합니다.Use the Agents library when you have multiple operations that must communicate with one another asynchronously. 메시지 블록 및 메시지 전달 함수 통해 잠금과 같은 동기화 메커니즘을 요구 하지 않고 병렬 응용 프로그램을 작성할 수 있습니다.Message blocks and message-passing functions let you write parallel applications without requiring synchronization mechanisms such as locks. 이렇게 하면 응용 프로그램 논리에 집중할 수 있습니다.This lets you focus on application logic.

에이전트 프로그래밍 모델을 만드는 데 종종 데이터 파이프라인 하거나 네트워크합니다.The agent programming model is often used to create data pipelines or networks. 데이터 파이프라인은는 각각에 보다 큰 목표에 기여 하는 특정 작업을 수행 하는 일련의 구성 요소.A data pipeline is a series of components, each of which performs a specific task that contributes to a larger goal. 데이터 흐름 파이프라인의 모든 구성 요소는 다른 구성 요소에서 메시지를 받으면 작업을 수행 합니다.Every component in a dataflow pipeline performs work when it receives a message from another component. 해당 작업의 결과 파이프라인 또는 네트워크의 다른 구성 요소에 전달 됩니다.The result of that work is passed to other components in the pipeline or network. 구성 요소 예를 들어 더 세분화 된 동시성 기능 다른 라이브러리에서 사용할 수는 라이브러리 PPL (병렬 패턴)합니다.The components can use more fine-grained concurrency functionality from other libraries, for example, the Parallel Patterns Library (PPL).

예제Example

다음 예제에서는이 항목의 앞부분에 나온 그림을 구현 합니다.The following example implements the illustration shown earlier in this topic.

// basic-agents.cpp
// compile with: /EHsc
#include <agents.h>
#include <string>
#include <iostream>
#include <sstream>

using namespace concurrency;
using namespace std;

// This agent writes a string to its target and reads an integer
// from its source.
class agent1 : public agent 
{
public:
   explicit agent1(ISource<int>& source, ITarget<wstring>& target)
      : _source(source)
      , _target(target)
   {
   }

protected:
   void run()
   {
      // Send the request.
      wstringstream ss;
      ss << L"agent1: sending request..." << endl;
      wcout << ss.str();

      send(_target, wstring(L"request"));

      // Read the response.
      int response = receive(_source);

      ss = wstringstream();
      ss << L"agent1: received '" << response << L"'." << endl;
      wcout << ss.str();

      // Move the agent to the finished state.
      done();
   }

private:   
   ISource<int>& _source;
   ITarget<wstring>& _target;
};

// This agent reads a string to its source and then writes an integer
// to its target.
class agent2 : public agent 
{
public:
   explicit agent2(ISource<wstring>& source, ITarget<int>& target)
      : _source(source)
      , _target(target)
   {
   }

protected:
   void run()
   {
      // Read the request.
      wstring request = receive(_source);

      wstringstream ss;
      ss << L"agent2: received '" << request << L"'." << endl;
      wcout << ss.str();

      // Send the response.
      ss = wstringstream();
      ss << L"agent2: sending response..." << endl;
      wcout << ss.str();

      send(_target, 42);

      // Move the agent to the finished state.
      done();
   }

private:   
   ISource<wstring>& _source;
   ITarget<int>& _target;
};

int wmain()
{
   // Step 1: Create two message buffers to serve as communication channels
   // between the agents.
   
   // The first agent writes messages to this buffer; the second
   // agents reads messages from this buffer.
   unbounded_buffer<wstring> buffer1;

   // The first agent reads messages from this buffer; the second
   // agents writes messages to this buffer.
   overwrite_buffer<int> buffer2;

   // Step 2: Create the agents.
   agent1 first_agent(buffer2, buffer1);
   agent2 second_agent(buffer1, buffer2);

   // Step 3: Start the agents. The runtime calls the run method on
   // each agent.
   first_agent.start();
   second_agent.start();

   // Step 4: Wait for both agents to finish.
   agent::wait(&first_agent);
   agent::wait(&second_agent);
}

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

agent1: sending request...
agent2: received 'request'.
agent2: sending response...
agent1: received '42'.

다음 항목에서는이 예제에 사용 되는 기능을 설명 합니다.The following topics describe the functionality used in this example.

비동기 에이전트Asynchronous Agents
대규모 컴퓨팅 작업을 해결 하는 비동기 에이전트의 역할을 설명 합니다.Describes the role of asynchronous agents in solving larger computing tasks.

비동기 메시지 블록Asynchronous Message Blocks
에이전트 라이브러리에서 제공 되는 다양 한 메시지 블록 형식을 설명 합니다.Describes the various message block types that are provided by the Agents Library.

메시지 전달 함수Message Passing Functions
에이전트 라이브러리에서 제공 되는 다양 한 메시지 전달 루틴을 설명 합니다.Describes the various message passing routines that are provided by the Agents Library.

방법: 다양한 공급자/소비자 패턴 구현How to: Implement Various Producer-Consumer Patterns
응용 프로그램에서 생산자-소비자 패턴을 구현 하는 방법에 설명 합니다.Describes how to implement the producer-consumer pattern in your application.

방법: call 및 transformer 클래스에 작업 함수 제공How to: Provide Work Functions to the call and transformer Classes
작업 함수를 제공 하는 여러 방법을 보여 줍니다 합니다 concurrency:: call 하 고 concurrency:: transformer 클래스입니다.Illustrates several ways to provide work functions to the concurrency::call and concurrency::transformer classes.

방법: 데이터 파이프라인에서 transformer 사용How to: Use transformer in a Data Pipeline
사용 하는 방법을 보여 줍니다 합니다 concurrency:: transformer 데이터 파이프라인에 클래스입니다.Shows how to use the concurrency::transformer class in a data pipeline.

방법: 완료된 작업 중에서 선택How to: Select Among Completed Tasks
사용 하는 방법을 보여 줍니다 합니다 concurrency:: choice 하 고 concurrency:: join 검색 알고리즘을 완료 하려면 첫 번째 작업을 선택 하는 클래스입니다.Shows how to use the concurrency::choice and concurrency::join classes to select the first task to complete a search algorithm.

방법: 정기적으로 메시지 보내기How to: Send a Message at a Regular Interval
사용 하는 방법을 보여 줍니다 합니다 concurrency:: timer 클래스 일정 한 간격으로 메시지를 보내려고 합니다.Shows how to use the concurrency::timer class to send a message at a regular interval.

방법: 메시지 블록 필터 사용How to: Use a Message Block Filter
수락 하거나 거부 하는 비동기 메시지 블록을 사용 하도록 설정 하려면 필터를 사용 하는 방법을 보여 줍니다.Demonstrates how to use a filter to enable an asynchronous message block to accept or reject messages.

PPL(병렬 패턴 라이브러리)Parallel Patterns Library (PPL)
응용 프로그램에서 병렬 알고리즘과 같은 다양 한 병렬 패턴을 사용 하는 방법에 설명 합니다.Describes how to use various parallel patterns, such as parallel algorithms, in your applications.

동시성 런타임Concurrency Runtime
병렬 프로그래밍을 간소화하는 동시성 런타임에 대해 설명하고 관련 항목의 링크를 제공합니다.Describes the Concurrency Runtime, which simplifies parallel programming, and contains links to related topics.