multithreading - 你如何杀死一个 core.async/thread?

标签 multithreading clojure terminate core.async

我收到了 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似乎对ManyToManyChannel没有影响s。

最佳答案

你让线程自然终止。如果需要外部终止,则必须实现它。

(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 返回的 channel 中获取来确定线程何时终止。 .

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

关于multithreading - 你如何杀死一个 core.async/thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598084/

相关文章:

multithreading - WSGI的线程和进程怎么统计?

java - 使用 Maven + Java + Clojure 确保良好的安全性/代码签名

xamarin.ios - 如何正确终止 MonoTouch 应用程序?

Spring @Async 注解

c - 作为多线程消息传递机制在管道中的可见性

java - Spring MVC 应用程序可以是多线程的,即使它的 servlet 不是吗?

clojure - 在环形应用程序中捕获异常的惯用方法

clojure - 如何在 Clojure 中定义通用递归函数

java - 即使线程尚未运行完毕,如何终止该线程?

erlang - 捕获 Erlang 应用程序被杀死的情况