Agent

Un agent représente tout comme les atom et les ref une identité qui référence une valeur. La particularité d'un agent est qu'il est asynchrone.

On peut le comparer à un acteur qui recevra un ensemble d'actions à réaliser et dont le traitement sera effectué de manière autonome sur un pool de threads.

Opérations de base

Un agent se définit via le symbole agent, qui prend en paramètre son état.

(def my-agent (agent 0))

Il existe deux fonctions afin de transmettre des actions à un agent: send-off et send.

(send-off my-agent
      (fn [state]
        (doing-some-work)
        (inc state)))

send-off et send prennent toutes les deux en paramètre une fonction dont le premier paramètre est son état et dont la dernière expression sera le nouvel état de l'agent.

Un agent effectuant ses opérations de manière asynchrone mais serialisée (les actions sont faites dans l'ordre de leur insertion) est le candidat idéal si l'on souhaite permettre l'accès à une ressource partagée, comme l'écriture dans un fichier par exemple.

send-off et send

La différence entre send-off et send est subtile. send-off envoie une action qui sera exécutée sur un thread dédié alors que send effectuera son opération sur un pool de thread interne à Clojure.

D'une manière générale: si l'opération effectue des opérations bloquantes, il faut utiliser send-off alors que les opérations non bloquantes peuvent être réalisées avec send.

Précédent - Suivant -

powered by mcorbin - Available on Github