Clojure – 为什么在阻塞插入到频道时执行挂起? (core.async)
请考虑以下代码段:
(let [chs (repeatedly 10 chan)] (doseq [c chs] (>!! c "hello")) (doseq [c chs] (println (<!! c)))) 执行此操作将永久挂起.这是为什么? 如果我做(去(>!c“你好”)),它的工作很好. 解决方法
要进行异步放置,请使用clojure.core.async / put!
(let [chs (repeatedly 10 chan)] (doseq [c chs] (put! c "hello")) (doseq [c chs] (println (<!! c)))) 这个例子在这个例子中是< !!由于所有必要的投注异步发生,总是会阻止.请注意以下事项: 是的,但不一样.放!是一个API包装器,围绕channel.async.impl.protocols / WritePort放置的通道实现!方法. (go(>!ch v))的宏扩展最终在同一个方法调用中发生,但将其包装在许多生成的状态机器代码中,以便可能停止放置操作并暂停执行go程序,直到消费者准备就绪从ch(尝试(宏展开`(go(>!ch v)))自己).产生一个去块只做一个异步放置操作是一种浪费,比调用put更糟糕!马上.去产生并返回一个额外的渠道,你可以把它的身体的结果.这可以让您等待完成执行,您无需在示例中执行(针对异步操作). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java套接字:我可以用一个线程编写TCP服务器吗?
- Java集合框架之Collection接口详解
- java – Hibernate和Criteria API返回Object数组而不是Tupl
- java – 使用Random.setSeed的重要性是什么?
- java – 防止Bukkit中指定玩家受到伤害?
- 线程“main”中的异常java.lang.RuntimeException:Stub
- 在Java代码中使用eclipselink从MATLAB运行
- java – 同步 – 与edegs编译器在两个方向重新排序障碍?
- java-me – 来自IP Camera的RTSP直播
- java编程实现多人聊天室功能