Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как убить core.async/thread?

Автор вопроса: Ben KovitzОтветов: 1

У меня есть несколько потоков, возвращенных core.async/thread, вовлеченных в какой-то процесс, который я собираюсь закрыть. Я не закрываю всю свою программу, только эти потоки. Как я могу завершить потоки?

Метод .stop класса Java Thread устарел, но я был бы рад его использовать, за исключением того, что core.async/thread возвращает не Thread, а ManyToManyChannel:

user=> (clojure.core.async/thread)
#object[clojure.core.async.impl.channels.ManyToManyChannel 0x780e97c0
  "clojure.core.async.impl.channels.ManyToManyChannel@780e97c0"]
user=> (type *1)
clojure.core.async.impl.channels.ManyToManyChannel

Я не нашел никакой документации по ManyToManyChannel. Звучит как странное название типа потока, так что здесь может быть что-то элементарное, чего я не понимаю. Но вот мой нынешний наивный, бессмысленно звучащий вопрос: как убить ManyToManyChannel?

clojure.repl/thread-stopper, похоже, не влияет на ManyToManyChannels.

multithreadingclojureterminate

Ответы

Ответ 1 · рейтинг 3 · Leon Grapenthin

Вы позволяете потоку завершиться естественным образом. Если внешнее завершение необходимо, вы должны его реализовать.

(defn terminatable [input-ch terminate-ch]
   (thread
     (loop []
       (let [[v ch] (alts!! [input-ch terminate-ch])]
         (if (identical? ch input-ch)
           (if (some? v)
             (do (process-input v) (recur))
             ;; else input-ch has closed -> don't call recur,
             ;; thread terminates
             )
           ;; else we received sth. from terminate-ch,
           ;; or terminate-ch has closed -> don't call recur,
           ;; thread terminates
           )))))

Затем завершите работу извне через (close! terminate-ch)

Наконец, вы можете определить, когда поток завершится, взяв данные из канала, возвращаемого thread.

I. e.

(take! (terminatable (chan) (doto (chan) close!))
       (fn [_] (println "Thread is terminated")))

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы