У меня внутренний конфликт по поводу использования Thread/sleep внутри блока go Clojure. Обычно не рекомендуется иметь какие-либо длительные процессы внутри блоков go, и Stuart Sierra упоминает, что сон в блоке go не предпочтителен а>:
В общем, любую работу, которая не блокирует, не спит или не выполняет ввод-вывод, можно безопасно поместить в блок перехода, не оказывая существенного влияния на пропускную способность системы.
В моем случае я хочу прослушать сообщения на канале и сгруппировать их, прежде чем уведомлять пользователя, если они приходят быстро. Или, если приходит только одно сообщение, уведомить об этом пользователя. В моем конкретном случае использования довольно часто несколько сообщений приходят либо в быстрой последовательности, либо по отдельности, и маловероятно, что сообщения приходят через равные промежутки времени.
Для этого у меня есть блок go-loop
, который ожидает ввода на канале. Когда он получает, он немного спит (секунду или две максимум), проверяет, поступил ли какой-либо другой ввод на канал тем временем, и на основе этого либо уведомляет пользователя обо всем, либо просто передает первое сообщение.
У меня в приложении не будет кучи таких go
блоков, только один. Поскольку Clojure всегда порождает более одного потока для обслуживания блоков go, блокировка одного потока с помощью сна не должна быть проблемой на практике. Но теоретически, интересно, есть ли более элегантный способ справиться с этим, не завязывая такую нить?