首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用core.async实现天网1m微基准?

如何用core.async实现天网1m微基准?
EN

Stack Overflow用户
提问于 2016-02-15 03:20:33
回答 1查看 195关注 0票数 5

为了试图理解core.async,我成功地实现了"Skynet 100万微基准“,即:

创造一个演员(哥鲁丁,无论如何),产生10个新演员,每个演员产生10个以上的演员,等等,直到100万演员在最后一级被创造出来。然后,它们返回其序号(从0到999999),该序号在上一级别上求和,并返回上游,直到到达根参与者。(答案应该是499999500000)。

这里有多种语言的实现:

https://github.com/atemerev/skynet

以下是我彻底失败的尝试:

代码语言:javascript
复制
(defn skynet [chan num size div]
  (if (= 1 size)
    (>! chan num)
    (>! chan (reduce + (let [rc  (async/chan)
                             n   (/ size div)]
                          (doall (for [i [0 div]]
                                   (skynet rc (+ num (* i n)) n div))
                                 (for [i [0 div]] (<! rc))))))))

我试着在REPL的一个围棋区里把它叫做:

代码语言:javascript
复制
  (time (go (<!! (skynet (async/chan) 0 1000000 10))))

我可能对有关core.async的许多事情(以及懒惰的评估)感到非常困惑。

我应该如何解决这个问题,为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 00:13:23

有关于一些限制能够做什么的core.async,所以您不能使用mapfor函数。

您的实现非常接近正确的实现。以下几点:

  1. go == one进程,所以您只是创建一个进程,而不是1m进程。
  2. <!!将在go块外使用
  3. <!将在go块内部使用
  4. 您使用不正确
  5. doall只接受一个参数

一个可以改进的工作实现:

代码语言:javascript
复制
(defn skynet [parent num size div]
  (go ;; We create a new process each time skynet is called
    (if (= 1 size)
      (>! parent num)
      (let [self (chan)
            new-size (/ size div)]
        (dotimes [i div] ;; dotimes is more explicit for side effects 
          (skynet self (+ num (* i new-size)) new-size div))
    (loop [i div ;; Manual reduce 
           t   0]
      (if (zero? i)
        (>! parent t)
        (recur (dec i)
               (+ t (<! self)))))))))

并称之为:

代码语言:javascript
复制
 (time
   (do
     (def result (chan))
     (def x (skynet result 0 1000000 10))
     (<!! result)))
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35400990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档