2011-12-07 9 views
8

Tengo una aplicación multiproceso escrita en Clojure. Existe un problema al hacer que un texto en la consola se visualice correctamente cuando varios hilos escriben en STDOUT. ¿Cómo puedo hacer esto correctamente en Clojure, para que las líneas no se vean entrelazadas? Creo que esto implicaría algún tipo de agente de IO por separado, pero no estoy seguro de cómo hacerlo.Sincronización de la salida estándar en Clojure

Respuesta

9

creo que esto implicaría algún tipo de agente de IO separada

Sí, eso debería funcionar. Cree un agente (def printer (agent nil)) y llámelo con la declaración print apropiada, por ejemplo, (send printer #(println msg)). Los mensajes se ponen en una cola y se ejecutan (asincrónicamente) de a uno por vez.

Para fines de registro también puede consultar tools.logging que utiliza agentes debajo del capó.

+0

Esto funciona, excepto que tengo que enviar al agente un trabajo de impresión a través de otro proxy de función. Enviar println directamente al agente no funcionará por alguna razón. – bvk256

+0

En [este artículo] (http://clojure.org/agents) en el sitio web de Clojure, dice: "Las acciones enviadas a un agente de otro ** agente único o hilo ** se producirán en el orden en que fueron enviado, ** potencialmente entrelazado ** con acciones enviadas al mismo agente ** de otras fuentes **. " ¿Esto significa que aún puede haber problemas cuando "** varios hilos ** escriben en STDOUT"? –

Cuestiones relacionadas