Agenti asincroni
Un agente asincrono (o solo agente) è un componente dell'applicazione che funziona in modo asincrono con altri agenti per risolvere attività di calcolo più grandi. Si consideri un agente come un'attività con un ciclo di vita impostato. Ad esempio, un agente potrebbe leggere i dati da un dispositivo di input/output (ad esempio la tastiera, un file su disco o una connessione di rete) e un altro agente potrebbe eseguire un'azione su tali dati non appena diventa disponibile. Il primo agente usa il passaggio di messaggi per informare il secondo agente che sono disponibili più dati. L'utilità di pianificazione dell'attività Runtime di concorrenza fornisce un meccanismo efficiente per consentire agli agenti di bloccare e restituire in modo cooperativo senza richiedere una precedenza meno efficiente.
La libreria agenti definisce la classe concurrency::agent per rappresentare un agente asincrono. agent
è una classe astratta che dichiara il metodo virtuale concurrency::agent::run. Il run
metodo esegue l'attività eseguita dall'agente. Poiché run
è astratta, è necessario implementare questo metodo in ogni classe derivata da agent
.
Ciclo di vita dell'agente
Gli agenti hanno un ciclo di vita impostato. L'enumerazione concurrency::agent_status definisce i vari stati di un agente. La figura seguente è un diagramma di stato che mostra come gli agenti progredisce da uno stato a un altro. In questa illustrazione le linee solide rappresentano i metodi che si chiamano dall'applicazione; le linee tratteggiate rappresentano i metodi chiamati dal runtime.
La tabella seguente descrive ogni stato nell'enumerazione agent_status
.
Stato agente | Descrizione |
---|---|
agent_created |
L'agente non è stato pianificato per l'esecuzione. |
agent_runnable |
Il runtime pianifica l'esecuzione dell'agente. |
agent_started |
L'agente è stato avviato ed è in esecuzione. |
agent_done |
L'agente è terminato. |
agent_canceled |
L'agente è stato annullato prima di entrare nello started stato. |
agent_created
è lo stato iniziale di un agente agent_runnable
e agent_started
sono gli stati attivi e agent_done
agent_canceled
sono gli stati del terminale.
Usare il metodo concurrency::agent::status per recuperare lo stato corrente di un agent
oggetto. Anche se il status
metodo è indipendente dalla concorrenza, lo stato dell'agente può cambiare in base al momento in cui il status
metodo restituisce. Ad esempio, un agente potrebbe trovarsi nello agent_started
stato quando si chiama il status
metodo , ma spostato nello agent_done
stato subito dopo la restituzione del status
metodo.
Metodi e funzionalità
La tabella seguente illustra alcuni dei metodi importanti che appartengono alla agent
classe . Per altre informazioni su tutti i metodi di agent
classe, vedere Classe agente.
metodo | Descrizione |
---|---|
start | Pianifica l'oggetto per l'esecuzione agent e lo imposta sullo agent_runnable stato. |
run | Esegue l'attività che deve essere eseguita dall'oggetto agent . |
done | Sposta un agente nello agent_done stato . |
cancel | Se l'agente non è stato avviato, questo metodo annulla l'esecuzione dell'agente e lo imposta sullo agent_canceled stato. |
status | Recupera lo stato corrente dell'oggetto agent . |
aspettare | Attende che l'oggetto agent entri nello agent_done stato o agent_canceled . |
wait_for_all | Attende che tutti gli oggetti forniti entrino agent nello agent_done stato o agent_canceled . |
wait_for_one | Attende che almeno uno degli oggetti forniti agent entri nello agent_done stato o agent_canceled . |
Dopo aver creato un oggetto agente, chiamare il metodo concurrency::agent::start per pianificarlo per l'esecuzione. Il runtime chiama il run
metodo dopo la pianificazione dell'agente e lo imposta sullo agent_runnable
stato.
Il runtime non gestisce le eccezioni generate dagli agenti asincroni. Per altre informazioni sulla gestione delle eccezioni e sugli agenti, vedere Gestione delle eccezioni.
Esempio
Per un esempio che illustra come creare un'applicazione basata su agente di base, vedere Procedura dettagliata: Creazione di un'applicazione basata su agente.