clojure.core.async报错:ReadPort协议take!方法未实现的解决
Clojure core.async 通道初始化错误分析与修复
错误原因
你的代码存在一个核心问题:在let绑定中,c chan没有调用chan函数,而是直接将chan这个函数对象赋值给了变量c。
由于你使用了两个future,线程调度具有不确定性:当某个future先执行时,会尝试对chan函数对象执行>!!或<!!操作,但chan函数本身并没有实现clojure.core.async.impl.protocols/ReadPort或WritePort协议,这就导致了偶尔出现的"找不到协议实现"错误。调度的随机性让错误出现概率约为1/4。
修复方法
只需要在绑定c时调用chan函数,创建真正的通道实例即可:
(ns channels.create (:require [clojure.core.async :refer [ chan >!! <!!]])) (let [c (chan)] ; 加上括号调用chan函数创建通道实例 (future (>!! c 42)) (future (println (<!! c))))
修改后,c会被绑定为合法的通道实例,>!!和<!!操作就能正常与通道交互,不会再触发协议错误。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

