Я использую 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 только для того, чтобы я мог удалить один клиент из список - плохой ход. Есть ли более подходящий способ сделать это с помощью swap! ? Я выбрал список для клиентского атома, так как запускаю дозык на каждом подключенном клиенте, чтобы захватить контент и сбросить его в сокет выходного потока.