2011-12-07 7 views
8

Ho un'applicazione multithread scritto in Clojure. C'è un problema nel rendere un testo nel display della console correttamente quando più thread scrivono su STDOUT. Come posso farlo correttamente in Clojure, quindi le linee non sembreranno interlacciate? Penso che questo implichi una sorta di agente di I/O separato, ma non sono sicuro di come farlo.sincronizzazione dell'output standard Clojure

risposta

9

penso che questo comporterebbe una sorta di separato agente IO

Sì, che dovrebbe funzionare. Creare un agente (def printer (agent nil)) e chiamarlo con il print dichiarazione del caso, per esempio, (send printer #(println msg)). I messaggi vengono messi in coda e vengono eseguiti (in modo asincrono) uno alla volta.

Ai fini della registrazione si potrebbe anche guardare tools.logging che utilizza agenti sotto il cofano.

+0

Questo funziona, tranne che devo inviare all'agente un processo di stampa attraverso un proxy un'altra funzione. L'invio di println direttamente all'agent non funzionerà per alcuni motivi. – bvk256

+0

In [questo articolo] (http://clojure.org/agents) sul sito web di Clojure, si dice: "Le azioni inviate a un agente da un altro ** singolo agente o thread ** si verificano nell'ordine in cui erano inviato, ** potenzialmente intercalato ** con azioni inviate allo stesso agente ** da altre fonti **. " Significa questo ancora ci potrebbe essere problemi quando "** ** discussioni più in scrittura a STDOUT"? –