gpt4 book ai didi

multithreading - Clojure 多线程输出流

转载 作者:行者123 更新时间:2023-12-04 08:26:24 25 4
gpt4 key购买 nike

我是 Clojure 的新手。我有多个线程试图写入输出流,如果我没记错的话,套接字和它们的流不是线程安全的,这意味着如果我同时写入它们,位可能会混淆。 Clojure 的主要优点之一是内置的竞态条件并发处理。我如何将其用于我的场景?

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

任何建议都会很有帮助。

提前致谢

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

现在我所有的线程在他们想要将数据写入输出流时调用这个函数

最佳答案

代理通常被认为是完成此类任务的正确工具。他们采用一系列任务在其内部状态上运行,并按照接收到的顺序运行它们。它们还可以很好地与 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

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

关于multithreading - Clojure 多线程输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com