Clojure多线程输出流

sqw*_*ale 3 sockets concurrency multithreading outputstream clojure

我是Clojure的新手.我有多个线程试图写入输出流和如果我没有错误的套接字和它们的流不是线程安全意味着如果我同时写入它们可以混淆位.clojure的主要好处之一是对竞争条件进行内置并发处理.我如何在我的场景中使用它?

我试着研究原子,参考等等.我最初认为声明输出流是一个原子可以工作,但我不太确定,因为它似乎避免同时改变原子状态(使用交换!)但是我认为你可以从多个线程取消引用一个原子意味着多个线程将deref保存输出流的atom并同时写入它.

任何建议都将是最有帮助的.

提前致谢

(defn send-my-data [output data-bytes]
  (try 
    (.write output)
    (.flush output)
    (catch Exception excp
       (println (format "issue %s" (.printStackTrace excp))))
Run Code Online (Sandbox Code Playgroud)

现在我的所有线程都会在想要将数据写入输出流时调用此函数

Art*_*ldt 5

代理通常被认为是执行此类任务的正确工具.他们将一系列任务运行在内部状态,并按接收顺序运行.他们也与Clojure的其他STM很好地配合.例如,发送到事务中的代理表单的消息发送一次,并且仅在事务提交时发送.

user> (let [output-agent (agent "")] 
        (dotimes [x 10] 
          (send output-agent (fn [_] (println "hello" x)))))
nil
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
Run Code Online (Sandbox Code Playgroud)

在这个例子中,要采取的动作是一个匿名函数,忽略它的输入并只打印一些东西.