Die-geister is a project mainly written in Clojure, it's free.
Composable Async Tasks for Clojure
Die Geister is a library that provides composable tasks that execute asynchonously.
task: a macro which results in an async task. geister.core> (task (+ 1 2)) geister.core.Task@aa754f7a geister.core> @*1 3 geister.core>
async: similar to let, but each value in a binding is expected to yield an async task, and async wraps its body in an implicit (task ...) geister.core> (async [x (task (+ 1 2))] (+ x 4)) geister.core.Task@90b56cdf geister.core> @*1 7 geister.core>
async-loop: like clojure's built in loop. use async-recur instead of recur. each loop iteration is queued up as a seperate async task. geister.core> (async-loop [[x & xs] (range 10) t 0] (if x (async-recur xs (+ x t)) t)) geister.core.Task@90ce3f54 geister.core> @*1 45 geister.core>
async tasks are chainable: geister.core> (chain (task (+ 1 2)) (fn [x] (task (inc x)))) geister.core.Task@aadbba2f geister.core> @*1 4 geister.core>
async tasks are joinable: geister.core> (join (task (+ 1 2)) (task (+ 3 4))) geister.core.MultiTask@df4ec6c0 geister.core> @*1 (3 7) geister.core>
exceptions are propagated through chains of async tasks. if you deref an async task and any async tasks that it depended on threw an exception, then that exception will be thrown. geister.core> (async [x (task "foo") y (task (+ 1 2))] (+ y x)) geister.core.Task@463b2d3c geister.core> (try @*1 (catch Exception e (println e)))
nil geister.core>
by default tasks are queued on clojure's pooledExecutor (same as send). you can rebind task-handler to change how and where async tasks are executed.
the TaskProtocol has been extended to futures so you can compose futures with async tasks geister.core> (join (future :foo) (task (+ 2 3))) geister.core.MultiTask@630cdaf geister.core> @*1 (:foo 5) geister.core>
FIXME: write
remove Task record, just use Future
namespace for doing async IO with tasks
nicer way to schedule tasks to run, perhaps at the namespace level "all tasks in this namespace are run using function X"
Copyright (C) 2010 FIXME
Distributed under the Eclipse Public License, the same as Clojure.