10
votes

Y a-t-il un moyen d'être informé quand un futur de clojure se termine?

Y a-t-il un moyen de fixer une montre sur un avenir afin qu'il déclenche un rappel lorsqu'il est fait?

Quelque chose comme ça? p>

> (def a (future (Thread/sleep 1000) "Hello World!")
> (when-done a (println @a))

...waits for 1sec...
;; =>  "Hello World"


2 commentaires

(printLn @a)) par lui-même bloque déjà en attente de la finition avant d'exécuter PrintLN. Que vouliez-vous de plus?


En outre, ce que vous pouvez réellement vouloir, c'est notificationsvice


5 Réponses :


16
votes

Vous pouvez commencer une autre tâche qui surveille l'avenir puis exécute la fonction. Dans ce cas, je vais simplement utiliser un autre avenir. Qui est bien entendu dans une fonction réalisée: xxx


0 commentaires


5
votes

Pour des cas très simples: Si vous ne voulez pas bloquer et ne vous souciez pas du résultat, ajoutez simplement le rappel de la définition future.

final MyCallBack callbackObj = new MyCallBack();
new Thread() {
     public void run() {
         a-taking-time-computation();
         callbackObj.call();
     }
 }.start()


0 commentaires

0
votes

au lieu d'ajouter du temps supplémentaire avec thread / dormir code>, je tire parti du fait que @ futur-ref code> pour toute référence à l'avenir attendra jusqu'au futur. est fait.

(defn  wait-for
  [futures-to-complete]
  (every? #(@%) futures-to-complete))


1 commentaires

# (@%) peut être modifié en DEREF . @ est juste du sucre syntaxique pour la fonction DEREF .



2
votes

une extension à la réponse acceptée

Veuillez noter la réserve suivante: p>

avec le ci-dessus lors de la mise en œuvre code> Le rappel ne sera pas invoqué Si l'avenir est annulé. Qui est p> xxx pré>

ne sera pas imprimé car l'appel DEREF sur l'annulation L'avenir posera une exception. P>

Si vous avez besoin de rappels pour arriver, je vous suggère: P>

  (do
    (def f0 (future (Thread/sleep 1000)))
    (then f0 (fn
               ([] (println "CANCELLED"))
               ([e] (println "THEN=>" e))))
    (Thread/sleep 500)
    (future-cancel f0))


0 commentaires