Sdílet prostřednictvím


Knihovna asynchronních agentů

Asynchronní knihovny agentů (nebo jen Knihovny agentů) poskytuje programovací model, který umožňuje zvýšit odolnost vývoj aplikací s podporou souběžného zpracování.Agenti knihovna je knihovna šablon jazyka C++, který podporuje programovací model založený na herce a zprávy v procesu předávání pro hrubý tok dat a úkoly kanálů.Knihovny agentů je založena na součásti správy plánování a prostředků modulu runtime souběžnosti.

Programovací model

Knihovny agentů poskytuje alternativy k sdíleného stavu tím, že umožňuje připojení izolovaných součástí prostřednictvím modelu asynchronní komunikace, který je založen na datový tok místo tok řízení.Datový tok odkazuje programování je model, kde jsou prováděny výpočty, když všechny požadované údaje k dispozici. řízení toku odkazuje na programovací model, kde jsou prováděny výpočty v předem stanovené pořadí.

Programovací model toku dat se vztahuje ke konceptu předávání zpráv, kdy nezávislé komponenty programu komunikují s jinými pomocí zasílání zpráv.

Knihovny agentů se skládá ze tří složek: asynchronní agenti, bloků asynchronní zprávy, a funkce předávání zpráv.Agenti udržení stavu a komunikovat mezi sebou a s externí součásti pomocí bloků zprávy a funkce předávání zpráv.Funkce předávání zpráv povolit odesílání a příjem zpráv z externích součástí a agentů.Asynchronní zprávu bloky podržte zprávy a povolit agenti komunikovat způsobem, synchronizované.

Následující ilustrace znázorňuje použití dvou agentů bloků zprávy používání a předávání zpráv funkce pro komunikaci.Na tomto obrázku agent1 odešle zprávu do agent2 s použitím concurrency::send funkce a concurrency::unbounded_buffer objektu.agent2používá concurrency::receive funkce pro čtení zprávy.agent2používá stejné metody k odeslání zprávy do agent1.Přerušované šipky představují tok dat mezi agenty.Plné šipky připojte k bloků zprávy, které zapisovat nebo číst z agentů.

Komponenty knihovny agentů

Příklad kódu, který implementuje tento obrázek je zobrazen dále v tomto tématu.

Agent programovací model má několik výhod oproti jiným souběžnost synchronizace a mechanismy, například události.Výhodou je, že pomocí předávání zpráv pro přenos změn stavu mezi objekty můžete izolovat přístup ke sdíleným prostředkům a tím zlepšit škálovatelnost.Výhodou předávání zpráv je, že dojde ke svázání synchronizace dat namísto provázání externí synchronizace objektu.To zjednodušuje přenos dat mezi součástmi a vyloučit chyby v aplikacích.

Když použít knihovnu agentů

Pokud máte více operací, které musí komunikovat s navzájem asynchronně, použijte knihovny agentů.Funkce předávání zpráv a bloků zprávy umožňují psát paralelních aplikací bez nutnosti synchronizačními mechanismy, jako jsou zámky.Díky tomu se můžete soustředit na aplikační logiku.

Programovací model agenta se často používá k vytvoření potrubí data nebo sítí.Datový kanál je série komponent, z nichž každá provádí konkrétní úkol, který přispívá k dosažení většího cíle.Každá součást potrubí tok dat provádí práce po obdržení zprávy od jiných komponent.Výsledek této práce je předáno jiné součásti v potrubí nebo síť.Součásti použít další funkce uzamykání souběžnosti z jiných knihoven, například, Knihovna PPL (Parallel Patterns Library).

Příklad

Následující příklad implementuje ilustrace uvedené dříve v tomto tématu.

// 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);
}

Tento příklad vytvoří následující výstup:

  

Následující témata popisují funkce, použitý v tomto příkladu.

Příbuzná témata