On Sat, 17 Oct 2009, mbrodersen <[email protected]> writes:
> If you want to print to stdout from multiple threads without getting
> the printing garbeled you can do something like the following (it also
> logs all printed values):
>
> (def wa-debug-agent)
>
> (defn wa-debug-make []
> (def wa-debug-agent (agent [])))
>
> (defn wa-debug-print
> "This makes it possible to print from multiple threads without
> overlapping each other"
> [& args]
> (send wa-debug-agent
> (fn [list v]
> (apply println v)
> (conj list v)) args))
Here is another variant using atoms instead.
(defn serial-println [_ _ _ args]
(apply println args)
(flush))
; #'user/serial-println
(def serial-stream (atom nil))
; #'user/serial-stream
(add-watch serial-stream :default serial-println)
; #<a...@10ade7e: nil>
(defn serial-enqueue [& args]
(swap! serial-stream (fn [_] args)))
; #'user/serial-enqueue
(def sprintln serial-enqueue)
; #'user/sprintln
(dotimes [i 10]
(.run
(Thread.
#(let [d (rand-int 2000)]
(Thread/sleep d)
(sprintln "Id:" i "Duration:" d)))))
; Id: 0 Duration: 1228
; Id: 1 Duration: 1067
; Id: 2 Duration: 893
; Id: 2 Duration: 893
; Id: 3 Duration: 1482
; Id: 4 Duration: 1514
; Id: 5 Duration: 79
; Id: 6 Duration: 1966
; Id: 7 Duration: 730
; Id: 8 Duration: 1489
; Id: 9 Duration: 1919
Regards.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---