Что этот кусок кода делает в Clojure.core.async? - PullRequest
1 голос
/ 17 апреля 2019

Это кусок кода от Красота Clojure Я не понимаю, что здесь делает alt!.

(defn listener [f ch]
  (let [stop-ch (chan)]
    (go-loop []
             (alt!
               stop-ch ([_] :no-op)
               ch      ([msg] (f msg) 
                              (recur))))
    {:listener ch :stop stop-ch}))

(defn stop-listener [{:keys [stop]}]
  (put! stop :stop))

Особенно, что означает второй аргумент alt!, который:

ch     ([msg] (f msg)
              (recur))

делает

И означает ли go-loop, что после вызова функции listener она будет бесконечно ждать получения значений?

1 Ответ

0 голосов
/ 17 апреля 2019

Go цикл alt!выполнит любой блок в зависимости от того, на каком канале есть сообщение.

Вы заметите, что stop-ch не повторяется, и поэтому после получения остановки цикл go завершится.

Есличто-то получено на канале слушателя, это обрабатывается функцией f.Затем повторение возвращает нас к началу цикла go, где alt!будет ожидать дальнейших сообщений либо на слушателе, либо на канале остановки.

Созданная структура слушателя представляет собой карту из двух каналов - поместите вещи в слушатель, и они будут найдены, что-нибудь положит на остановку ислушатель остановится.Эта заключительная деталь затем абстрагируется для пользователя стоп-слушателем fn.

Все это, по сути, всего лишь простой адаптер между каналом core.async и функцией с логикой очистки.

И означает ли, что go-loop означает, что после вызова функции слушателя она будет ждать неопределенное время для получения значений?

Нет.Вызов слушателя не заблокирует поток управления.Однако созданная петля go будет «блокироваться» до тех пор, пока не получит вход по одному из каналов.Я использую кавычки, потому что это не заблокированный поток - я действительно рекомендую вам взглянуть на некоторые основные презентации core.async после того, как вы сыграете на REPL.Как только вы можете связать поведение с теорией, это довольно просто.

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