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

问题描述 投票:0回答:1

我正在学习 clojure.async 库。

下面是我的代码。

(ns channels.create
  (:require [clojure.core.async :refer [ chan >!! <!!]]))

(let [c chan]
  (future (>!! c 42))
  (future (println (<!! c))))

当我将上述命名空间发送到 repl 时,出现以下错误 -

#object[clojure.core$future_call$reify__8544 0x3cf627ec {:状态:失败, :val #error{:cause "没有实现方法::take! 协议: #'clojure.core.async.impl.protocols/ReadPort 找到类: clojure.core.async$chan", :通过 [{:类型 java.util.concurrent.ExecutionException, :消息“java.lang.IllegalArgumentException:没有实现方法::take!协议:#'clojure.core.async.impl.protocols/ReadPort 找到类:clojure.core.async $chan”, :at [java.util.concurrent.FutureTask 报告“FutureTask.java”122]} {:type java.lang.IllegalArgumentException, :消息“没有实现方法::take!协议:#'clojure.core.async.impl.protocols/ReadPort 找到类:clojure.core.async $chan”, :at [clojure.core$_cache_protocol_fn invokeStatic "core_deftype.clj" 584]}], :trace [[clojure.core$_cache_protocol_fn invokeStatic "core_deftype.clj" 584] [clojure.core$_cache_protocol_fn 调用“core_deftype.clj”576] [clojure.core.async.impl.protocols$eval1957$fn__1958$G__1948__1965 调用 “协议.clj” 15] [clojure.core.async$fn__2637 invokeStatic "async.clj" 135] [clojure.core.async$fn__2637 调用“async.clj”127] [channels.create$eval11241$fn__11244 调用“create.clj”3] [clojure.core$binding_conveyor_fn$fn__5823 调用“core.clj”2047] [clojure.lang.AFn 调用“AFn.java”18] [java.util.concurrent.FutureTask run$$$capture "FutureTask.java" 264] [java.util.concurrent.FutureTask 运行“FutureTask.java”-1] [java.util.concurrent.ThreadPoolExecutor runWorker“ThreadPoolExecutor.java”1128] [java.util.concurrent.ThreadPoolExecutor$Worker 运行“ThreadPoolExecutor.java”628] [java.lang.Thread run "Thread.java" 829]]}}]

我的代码有什么错误?我该如何解决这个错误?

注意:该错误并非总是发生,而是连续发生 4 次中的 1 次。以下是屏幕截图。

clojure
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.