Прерывание вызовов clojure.core.async - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь выяснить, как написать оболочку clojure, используя асинхронные каналы для UDP-сокета.

Учитывая только часть чтения, моя цель - прочитать пакеты из сокета и поместить их в канал clojure.core.async. Независимо от того, использую ли я DatagramChannel или DatagramSocket, для чтения потребуются некоторые блокирующие вызовы, такие как Selector.select() или DatagramSocket.receive(), которые следует поместить в цикл в отдельном потоке.

Как мне правильно остановить приемный поток в этом случае? В чистом Java я бы отправил прерывание потоку, которое остановило бы чтение блокировки с InterruptedException, но я не знаком с clojure.core.async, и я не знаю, как >!! реагирует на прерывание.

1 Ответ

0 голосов
/ 08 мая 2018

Все, что вам нужно сделать, это закрыть канал . Затем получатель будет читать nil при следующем чтении. async использует nil в качестве значения часового, чтобы указать «канал закрыт» для читателей. Обратите внимание, что это означает, что вы не можете отправить nil по каналу как обычный фрагмент данных, так как читатели будут неверно истолковывать его как значение «закрытый канал» (вам придется заменить nil данные на :my.proj/nil или что-то в этом роде).

Тогда принимающий поток может просто выйти из любого цикла, в котором он находится, и объект Thread будет очищен как обычно.

См. Также Пример печально известной машины для хот-догов (ням!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...