Multithreadisme: Pour aller plus loin

Clojure propose beaucoup d'autres éléments afin de simplifier la programmation concurrente et parralèle. De plus, on peut toujours utiliser les primitives de la plateforme hôte grâce à l'interopérabilité Java.

Future

Une future permet l'exécution d'un traitement dans un nouveau thread. Une fois résolue, la valeur est mise en cache.

(def my-future
  (future
    (Thread/sleep 10000) ; Doing some work
    4))                  ; Returns and cache the result

Elle peut être déréférencée de manière bloquante grâce à deref ou @.

(deref my-future) ; Dereferences the future - blocking

Promise

Une promise est une primitive qui peut être lu que lorsque sa valeur lui a été fourni (généralement par un autre thread).

(def my-promise (promise))
(deliver my-promise 12)

Elle peut être déréférencée de manière bloquante grâce à deref ou @.

(deref my-promise) ; Deferences the promise - blocking until a value has been delivered

Java Interop

La langage Java continue de fournir des éléments intéressants dans son package java.util.concurrent. On retrouve par exemple les Executors et le ForkJoin framework.

L'intéropérabilité avec le langage Java est très simple :

  • Le . ajouté au nom de la classe permet d'instancier un objet
  • Le / permet d'appeler une méthode statique sur une classe
  • Le . ajouté au début du nom de la méthode permet de l'invoquer
;; Calls the constructor
(def queue (java.util.concurrent.ArrayBlockingQueue.))

;; Calls a static method
(def executor (java.util.concurrent.Executors/newFixedThreadPool 10))

;; Calls a method on an object
(.submit executor #(println "Hello"))

Précédent - Suivant -

powered by mcorbin - Available on Github