Поделиться через


Асинхронные агенты

Асинхронный агент (или просто агент) — это компонент приложения, который работает асинхронно с другими агентами для решения более крупных вычислительных задач. Подумайте об агенте как задаче, которая имеет заданный жизненный цикл. Например, один агент может считывать данные с устройства ввода и вывода (например, клавиатуры, файла на диске или сетевого подключения), а другой агент может выполнять действия с данными по мере его доступности. Первый агент использует передачу сообщений для информирования второго агента о доступности дополнительных данных. Планировщик задач среды выполнения параллелизма предоставляет эффективный механизм, позволяющий агентам совместно блокировать и уступать без необходимости в менее эффективном вытеснении.

Библиотека агентов определяет класс параллелизма::agent для представления асинхронного агента. agent — абстрактный класс, который объявляет параллелизм виртуального метода ::agent::run. Метод run выполняет задачу, выполняемую агентом. Поскольку run является абстрактным, метод необходимо реализовать в каждом классе, наследуемом от agent.

Жизненный цикл агента

Агенты имеют заданный жизненный цикл. Перечислимый тип concurrency::agent_status определяет различные состояния агента. На следующем рисунке представлена диаграмма состояний, показывающая, как агенты переходят из одного состояния в другое. На этом рисунке сплошные линии представляют методы, вызываемые из приложения; Пунктирные линии представляют методы, вызываемые из среды выполнения.

Схема состояния агента.

В следующей таблице описано каждое состояние в перечислении agent_status.

Состояние агентов Описание
agent_created Агент еще не запланирован на исполнение.
agent_runnable Среда выполнения выполняет планирование агента для выполнения.
agent_started Агент запущен и работает.
agent_done Агент завершил работу.
agent_canceled Агент был отозван, прежде чем переходил в started состояние.

agent_created — начальное состояние агента, agent_runnableagent_started а также активные состояния и agent_doneagent_canceled являются состояниями терминала.

Используйте метод concurrency::agent::status, чтобы получить текущее состояние объекта agent. status Хотя метод является потокобезопасным, состояние агента может измениться к моменту возврата метода status. Например, агент может находиться в состоянии agent_started при вызове метода status, но перемещается в состояние agent_done сразу после возврата метода status.

Методы и компоненты

В следующей таблице показаны некоторые важные методы, принадлежащие классу agent . Дополнительные сведения обо всех методах agent класса см. в разделе Класс агента.

Метод Описание
Начало agent Запланирует выполнение объекта и установит его в состояние agent_runnable.
запуск Выполняет задачу, выполняемую agent объектом.
Договорились Перемещает агента в agent_done состояние.
Отмена Если агент не был запущен, этот метод отменяет выполнение агента и переводит его в состояние agent_canceled.
состояние Извлекает текущее состояние agent объекта.
ждать Ожидает, пока agent объект войдет в agent_done состояние или agent_canceled состояние.
ожидать_всех Ожидает, чтобы все предоставленные agent объекты вошли в agent_done состояние или agent_canceled состояние.
wait_for_one Ожидает, когда хотя бы один из предоставленных agent объектов перейдет в состояние agent_done или agent_canceled.

После создания объекта агента вызовите метод concurrency::agent::start, чтобы запланировать его выполнение. Исполняющая среда вызывает run метод после планирования агента и устанавливает его в состояние agent_runnable.

Среда выполнения не управляет исключениями, создаваемыми асинхронными агентами. Дополнительные сведения об обработке исключений и агентах см. в разделе "Обработка исключений".

Пример

Пример создания базового приложения на основе агента см. в пошаговом руководстве по созданию приложения на основе агента.

См. также

Библиотека асинхронных агентов