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

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

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

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

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

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

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

Состояние агента

Описание

agent_created

Выполнение агента не запланировано.

agent_runnable

Среда выполнения планирует агент для выполнения.

agent_started

Агент был запущен и работает.

agent_done

Выполнение агента завершено.

agent_canceled

Агент был отменен до перехода в состояние started.

agent_created — это начальное состояние агента, agent_runnable и agent_started — активные состояния, а agent_done и agent_canceled — конечные состояния.

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

Методы и свойства

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

Метод

Описание

start

Планирует объект agent для выполнения и задает для него состояние agent_runnable.

run

Выполняет задачу, которая должна быть выполнена объектом agent.

done

Переводит агент в состояние agent_done.

отменить

Если агент не был запущен, этот метод отменяет выполнение агента и задает для него состояние agent_canceled.

status

Извлекает текущее состояние объекта agent.

wait

Ожидает перехода объекта agent в состояние agent_done или agent_canceled.

wait_for_all

Ожидает перехода всех предоставленных объектов agent в состояние agent_done или agent_canceled.

wait_for_one

Ожидает перехода в состояние agent_done или agent_canceled хотя бы одного из предоставленных объектов agent.

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

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

Пример

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

См. также

Основные понятия

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