Следует ли закрывать каналы clojure core.async, когда они больше не используются?

Метод Close (по крайней мере, в мире Java ) — это то, что вы, как добропорядочный гражданин, должны вызвать, когда закончите использовать соответствующий ресурс. Каким-то образом я автоматически начал применять то же самое для функции close! из ядра. асинхронная библиотека. Насколько я понимаю, эти каналы не привязаны ни к какому IO, и поэтому я не уверен, стоит ли звонить близко!. Можно ли оставлять каналы (локальные) для сборки мусора, не закрывая их?


person Viktor K.    schedule 05.03.2015    source источник


Ответы (1)


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

person Arthur Ulfeldt    schedule 05.03.2015
comment
Хороший ответ, просто пример. когда имеет смысл, может быть, когда вы используете async/reduce, для чего потребуется закрытый входной канал, прежде чем что-то получить. - person Andrea Richiardi; 19.06.2015
comment
наиболее распространенным примером является core.async/timeout, который использует закрытие канала, чтобы показать, что время истекло, и значение не было создано. обычно закрытие канала происходит после получения значения или вместо него. - person Arthur Ulfeldt; 19.06.2015