中断 clojure.core.async 调用



我正在尝试弄清楚如何使用UDP套接字的异步通道编写clojure包装器。

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

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

您所要做的就是关闭频道。然后,接收器将在下一次读取时读取nilasync使用nil作为哨兵值来指示读者的"通道关闭"。 请注意,这意味着您不能将nil作为普通数据通过通道发送,因为读者会将其误解为"通道关闭"的意思(您必须用:my.proj/nil或其他东西替换nil数据(。

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

另请参阅臭名昭著的热狗机示例(好吃!

最新更新