iovxw

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 的区别)