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

gil*_*aso 4 multithreading asynchronous clojure core.async

使用频道时,future建议还是thread?是否有时候future更有意义?

Rich Hickey关于core.async的博文建议使用thread而不是future:

虽然你可以在使用例如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]))))
Run Code Online (Sandbox Code Playgroud)

~ https://github.com/clojure/core.async/blob/master/examples/ex-async.clj

Mic*_*zyk 10

摘要

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

thread和之间的差异future

正如您引用的core.async博客文章的片段中所指出的,thread返回一个频道,就像go:

(let [c (thread :foo)]
  (<!! c))
;= :foo
Run Code Online (Sandbox Code Playgroud)

该通道由大小为1的缓冲区支持,并在thread表单正文返回的值放在其上后关闭.(除非返回的值恰好是nil,在这种情况下,通道将关闭而不会放置任何内容 - core.async通道不接受nil.)

这使得thread与core.async的其余部分很好地契合.特别是,它意味着go+单个操作和thread+双重操作在代码结构方面确实以相同的方式使用,您可以在alt!/ alts!(和双重等价物)中使用返回的通道等等向前.

相反,返回future可以是deref'd(@)来获取future表单主体(可能nil)返回的值.这使得future非常适合使用不使用通道的常规Clojure代码.

正在使用的线程池有另一个不同之处 - thread使用特定于core.async的线程池,同时future使用其中一个代理支持池.

当然,所有双重操作,以及put!take!,无论从哪个方式调用它们的方式都可以正常工作.