使用频道时,建议future
还是thread
?是否有future
更有意义的时候?
Rich Hickey关于core.async的博文建议使用thread
而不是future
:
虽然您可以在使用以下方法创建的线程上使用这些操作未来,还有一个宏,线程,类似于go,它将启动一流的线程并类似地返回一个频道,并且应该优先考虑未来的频道工作。
〜http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html
但是,core.async示例在使用频道时广泛使用future
:
(defn fake-search [kind]
(fn [c query]
(future
(<!! (timeout (rand-int 100)))
(>!! c [kind query]))))
〜https://github.com/clojure/core.async/blob/master/examples/ex-async.clj
答案 0 :(得分:10)
一般情况下,thread
及其频道返回对于频道突出的应用部分可能会更方便。另一方面,应用程序中与其边界的某些通道接口但未在内部使用core.async的任何子系统都可以随意以最适合它们的方式启动线程。
thread
和future
正如你引用的core.async博客文章的片段所指出的那样,thread
会返回一个频道,就像go
一样:
(let [c (thread :foo)]
(<!! c))
;= :foo
该频道由大小为1的缓冲区支持,并在thread
表单正文返回的值后关闭。 (除非返回的值恰好是nil
,在这种情况下,通道将关闭而不会放置任何内容 - core.async通道不接受nil
。)
这使得thread
很好地适应了core.async的其余部分。特别是,这意味着go
+单声道操作和thread
+双重操作确实在代码结构方面以相同的方式使用,您可以在{中使用返回的通道{1}} / alt!
(和双重等同物)等等。
相反,alts!
的返回可以是future
'd(deref
),以获取@
表单正文返回的值(可能为future
})。这使得nil
非常适合使用不使用频道的常规Clojure代码。
正在使用的线程池有另一个区别 - future
使用特定于core.async的线程池,而thread
使用其中一个代理支持池。
当然,所有双重操作,以及future
和put!
,无论调用它们的线程是如何开始的,都能正常工作。
答案 1 :(得分:0)
听起来他建议使用核心。 async的内置线程宏而不是java的Thread类。
http://clojure.github.io/core.async/#clojure.core.async/thread