Thread/sleep внутри блока Clojure go

У меня внутренний конфликт по поводу использования Thread/sleep внутри блока go Clojure. Обычно не рекомендуется иметь какие-либо длительные процессы внутри блоков go, и Stuart Sierra упоминает, что сон в блоке go не предпочтителен:

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

В моем случае я хочу прослушать сообщения на канале и сгруппировать их, прежде чем уведомлять пользователя, если они приходят быстро. Или, если приходит только одно сообщение, уведомить об этом пользователя. В моем конкретном случае использования довольно часто несколько сообщений приходят либо в быстрой последовательности, либо по отдельности, и маловероятно, что сообщения приходят через равные промежутки времени.

Для этого у меня есть блок go-loop, который ожидает ввода на канале. Когда он получает, он немного спит (секунду или две максимум), проверяет, поступил ли какой-либо другой ввод на канал тем временем, и на основе этого либо уведомляет пользователя обо всем, либо просто передает первое сообщение.

У меня в приложении не будет кучи таких go блоков, только один. Поскольку Clojure всегда порождает более одного потока для обслуживания блоков go, блокировка одного потока с помощью сна не должна быть проблемой на практике. Но теоретически, интересно, есть ли более элегантный способ справиться с этим, не завязывая такую ​​нить?


person Domchi    schedule 09.11.2016    source источник


Ответы (1)


Вместо блокировки в Thread/sleep лучше использовать clojure.core.async/timeout. Существует пример на ClojureDocs, очень похожий на ваш сценарий:

(go-loop [seconds (atom 0)
          add-seconds! #(swap! seconds + %)]
  (println "Waiting 1 second")
  (<! (timeout 1000))
  (add-seconds! 1)
  (println "Waiting 2 seconds")
  (<! (timeout 2000))
  (add-seconds! 2)
  (println
    (format "Waited %s seconds"
            @seconds))) 
person Piotrek Bzdyl    schedule 09.11.2016
comment
Большое спасибо, тайм-аут идеально подходит для моих целей! - person Domchi; 09.11.2016