中断clojure.core.async调用

时间:2018-05-07 22:28:59

标签: asynchronous clojure

我试图找出如何使用异步通道为UDP套接字编写clojure包装器。

仅考虑阅读部分,我的目标是从套接字读取数据包并将其放入clojure.core.async频道。无论我使用的是DatagramChannel还是DatagramSocket,读取都需要一些阻塞调用,例如Selector.select()DatagramSocket.receive(),这些调用应该放在一个单独的线程循环中。< / p>

在这种情况下我应该如何正确地停止接收线程?在纯Java中,我会向线程发送一个中断,这将阻止阻塞读取InterruptedException,但是我不熟悉clojure.core.async,我也不知道>!!对中断的反应。

1 个答案:

答案 0 :(得分:3)

您所要做的就是close the channel。然后,接收器将在下一次读取时读取nilasync使用nil作为标记值,​​表示“渠道已关闭”给读者。请注意,这意味着您无法通过频道发送nil作为正常数据,因为读者会将其误解为“频道已关闭”(您必须将nil数据替换为:my.proj/nil或某事)。

然后接收线程可以简单地退出它所在的循环,并且Thread对象将被正常清理。

另见the infamous Hot Dog Machine example(yum!)。