我正在尝试弄清楚如何使用UDP套接字的异步通道编写clojure包装器。
仅考虑读取部分,我的目标是从套接字读取数据包并将它们放入clojure.core.async
通道中。无论我使用DatagramChannel
还是DatagramSocket
,阅读都需要一些阻塞调用,如Selector.select()
或DatagramSocket.receive()
,这些调用应该放在一个单独的线程中
。在这种情况下,我应该如何正确停止接收线程?在纯Java中,我会向线程发送一个中断,这将停止阻塞读取,InterruptedException
,但我不熟悉clojure.core.async
,我不知道>!!
对中断的反应。
您所要做的就是关闭频道。然后,接收器将在下一次读取时读取nil
。async
使用nil
作为哨兵值来指示读者的"通道关闭"。 请注意,这意味着您不能将nil
作为普通数据通过通道发送,因为读者会将其误解为"通道关闭"的意思(您必须用:my.proj/nil
或其他东西替换nil
数据(。
然后接收线程可以简单地退出它所在的任何循环,并且 Thread 对象将正常清理。
另请参阅臭名昭著的热狗机示例(好吃!