代码之家  ›  专栏  ›  技术社区  ›  user51

没有实现方法::take!为类clojure.core.async.impl.protocols/ReadPort找到了协议的#'clojure.core.async$chan

  •  0
  • user51  · 技术社区  · 3 年前

    我在学习 clojure.async 图书馆

    下面是我的代码。

    (ns channels.create
      (:require [clojure.core.async :refer [ chan >!! <!!]]))
    
    (let [c chan]
      (future (>!! c 42))
      (future (println (<!! c))))
    

    当我将上面的命名空间发送到repl时,我得到以下错误-

    #对象[clojure.core$future_call$reify__8544 0x3cf627ec {:status:失败, :val#error{:cause“找不到类clojure.core.async.impl.protocols/ReadPort的方法::take!的实现:clojure.care.async$chan”, :通过[{:type java.util.courrent.ExecutionException, :message“java.lang.IllegalArgumentException:找不到类clojure.core.async.impl.protocols/ReadPort的方法::take!的实现:clojure.care.async$chan”, :位于[java.util.concurrent.FutureTask report“FutureTask.java”122]} {:type java.lang.IllegalArgumentException, :message“找不到类clojure.core.async.impl.protocols/ReadPort的方法::take!的实现:clojure/core.async$chan”, :在[clojure.core$_cache_procol_fn invokeStatic“core_deftype.clj”584]}]处, :trace[[clojure.core$_cache_procol_fn invokeStatic“core_deftype.clj”584] [clojure.core$_cache_procol_fn invoke“core_deftype.clj”576] [clojure.core.async.impl.协议$eval1957$fn__1958$G__1948__1965 援引 “protocols.clj” 15] [clojure.core.async$fn__2637 invokeStatic“async.clj”135] [clojure.core.async$fn__2637 invoke“async.clj”127] [channels.create$eval11241$fn__11244 invoke“create.clj”3] [clojure.core$binding_conveyor_fn$fn__5823 invoke“core.clj”2047] [clojure.lang.AFn调用“AFn.java”18] [java.util.concurrent.FutureTask运行$$$capture“FutureTask.java”264] [java.util.concurrent.FutureTask运行“FutureTask.java”-1] [java.util.concurrent.ThreadPoolExecutor runWorker“ThreadPoolExecutor.java”1128] [java.util.concurrent.ThreadPoolExecutor$Worker run“ThreadPoolExecutor.java”628] [java.lang.Thread run“Thread.java”829]]}}]

    我的代码中有什么错误?如何修复此错误?

    注意:错误并不总是发生,但在4次中有1次是一致发生的。下面是屏幕截图。

    channel put and take error

    1 回复  |  直到 3 年前
        1
  •  2
  •   amalloy    3 年前

    chan 是一个函数。 (chan) 是一个通道。

    关于您的“不一致”编辑:多线程代码是活泼的。REPL有时会在对其进行足够的评估以注意到错误之前查看未来,有时则不会。

    推荐文章