Future vs Thread:哪个更适合在core.async中使用频道?

时间:2013-12-17 03:29:12

标签: multithreading asynchronous clojure core.async

使用频道时,建议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

2 个答案:

答案 0 :(得分:10)

摘要

一般情况下,thread及其频道返回对于频道突出的应用部分可能会更方便。另一方面,应用程序中与其边界的某些通道接口但未在内部使用core.async的任何子系统都可以随意以最适合它们的方式启动线程。

threadfuture

之间的差异

正如你引用的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使用其中一个代理支持池。

当然,所有双重操作,以及futureput!,无论调用它们的线程是如何开始的,都能正常工作。

答案 1 :(得分:0)

听起来他建议使用核心。 async的内置线程宏而不是java的Thread类。

http://clojure.github.io/core.async/#clojure.core.async/thread