Clojure Thread/sleep 在 core.async 里的坑
文档为何没标注
给 Telegram 写的一个 RSS Bot 总是随机出现大量重复推送更新的 BUG,还以为是数据库或者 RSS 对比的问题,然而逻辑上根本没问题
百思不得其解
直到发现了自己在 loop 用的是 Thread/sleep
来进行定时的,它是 Thread
啊!
这个是真被坑到了,有不少 core.async
的例子里都是直接用的 Thread/sleep
比如这个:https://gist.github.com/danneu/5941767
然而注意看评论,这货会打乱 core.async
的线程池,导致出现一些魔法的 BUG
比如上边的重复推送 BUG,调度器都被 sleep 了,BUG 还能不魔法吗
好在只用 core.async
的协程干了这一件事,要是开着多种功能的协程,就彻底乱套了
修复也很简单,用 (<!! (core.async/timeout time))
来代替就行了
如果这个 sleep 本身就在 go
块里,就用 <!
取代 <!!
,换取更好的性能(park 和 block 的区别)