gpt4 book ai didi

multithreading - 在 Clojure 中删除原子列表中项目的最佳方法

转载 作者:行者123 更新时间:2023-12-04 23:03:20 25 4
gpt4 key购买 nike

我使用 server.socket 将数据流式传输到多个客户端,server.socket 为每个客户端连接使用线程。
我目前有这样的事情:

(def clients (atom ())) ; connected clients defined globally for that namespace

(swap! clients conj a) ; adds a client (which is an atom itself as well), this is in a function that is run on the client's thread

;I want to better the process of removing a client!
(dosync (reset! clients (remove #{a} @clients))) ; removes client from list, run in a function on the client's thread

我运行一个通过每个客户端运行并获取内容的函数,它在多个客户端线程中的每一个上都处于无限循环中,因此它同时运行:
(doseq [c @clients]
(print ((deref c) :content))
(flush))

我得出的结论是在线程中使用 Atom 确实可以使程序顺利运行并允许非阻塞读取,所以我对此很满意,只是我觉得重置全局客户端的 Atom 只是为了我可以从中删除单个客户端该列表是一个糟糕的举动。有没有更合适的方法来使用swap! ?当我在每个连接的客户端上运行 doseq 以获取内容并将其刷新到输出流套接字时,我为客户端 atom 选择了列表。

最佳答案

避免取消引用 swap! 中的原子或 reset! .

这里swap!会给你你需要的东西。它需要一个接收当前值的函数,您可以将其用于更新:

(def clients (atom '(:a :b :c :d)))
(swap! clients (fn [s] (remove #{:a} s)))

你可能已经习惯了看不到 swap! 的函数参数如上所述,因为 swap!将该函数应用于提供的任何其他参数,因此如果它们的顺序正确,例如如果我们为客户使用 set,我们可以
(def clients (atom #{:a :b :c :d}))
(swap! clients disj :a)

关于multithreading - 在 Clojure 中删除原子列表中项目的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17746472/

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