我不确定此函数如何使线程进入睡眠状态

时间:2019-07-04 12:11:26

标签: clojure functional-programming

我正在阅读有关Clojure的书,在这个示例中,他们想将数据放入频道中。但是,作者提到core.async go块会随机进入睡眠状态,并指定random-add函数负责使该块进入随机的睡眠时间。我尝试查看Clojure文档,但找不到任何异步/睡眠信息。让我最困惑的是作者对随机加法功能的评价。

“此随机时间将是一个称为random-add的函数。它使用 一个rand-int函数,它选择一个介于0到100,000之间的随机整数。然后,它将它用在一个函数中,该函数将求和一个用随机长度的数字1填充的向量。

这对我没有意义,因为(repeat 1 (rand-int 100000))将首先返回指定范围内的1个随机数的列表,然后将该列表与向量相连接,然后reduce +实际上返回1个元素的列表。

(ns async-tea-party.core
   (:require [clojure.core.async :as async]))

(def google-tea-service-chan (async/chan 10))
(def yahoo-tea-service-chan (async/chan 10))

(defn random-add []
  (reduce + (conj [] (repeat 1 (rand-int 100000)))))

(defn request-google-tea-service []
  (async/go
  (random-add)
  (async/>! google-tea-service-chan
  "tea compliments of google")))

(defn request-yahoo-tea-service []
  (async/go
  (random-add)
  (async/>! yahoo-tea-service-chan
  "tea compliments of yahoo")))

(defn request-tea []
  (request-google-tea-service)
  (request-yahoo-tea-service)
  (async/go (let [[v] (async/alts!
    [google-tea-service-chan
    yahoo-tea-service-chan])]
    (println v))))```

No errors, just don't quite understand how this code makes any sense, especially with "async/go (random-add)" because (random-add) returns a list?

0 个答案:

没有答案