Я смотрю на Clojure core.async впервые, и проходил через эту прекрасную презентацию Рича Хики: http://www.infoq.com/presentations/clojure-core-asyncКак очистить каналы core.async от clojure?
У меня был вопрос о примере он показывает в конце своего выступления:
Согласно Rich, этот пример в основном пытается получить результат в Интернете, видео и изображении для конкретного запроса. Он пробует два разных источника параллельно для каждого из этих результатов и просто вытаскивает самый быстрый результат для каждого. И вся операция может занимать не более 80 мс, поэтому, если мы не можем получить, например, результат изображения в 80 мс, мы просто сдадимся. «Самая быстрая» функция создает и возвращает новый канал и запускает два режима гонок, чтобы получить результат и поместить его на канал. Затем мы просто берем первый результат из «самого быстрого» канала и шлепаем его по каналу c.
Мой вопрос: что происходит с этими тремя временными неназванными «быстрыми» каналами после того, как мы берем их первый результат? Предположительно, все еще есть процесс go, который припаркован, пытаясь поместить второй результат на канал, но никто не слушает, так что он никогда не завершается. И поскольку канал никогда не связан ни с чем, не похоже, что у нас есть какой-либо способ сделать что-нибудь с ним снова. Будет ли процесс «&» «осознать», что никто больше не заботится о своих результатах и не очистится? Или мы по сути просто «пропустили» три канала/go процессы в этом коде?
Хм, хорошо. Теперь у меня есть два противоречивых ответа от вас и Леона. Вы могли бы предоставить ссылку на свое требование? – Ord
Да, пожалуйста, обратитесь к деталям реализации. Также объясните, как это будет работать в приведенном выше примере кода. –
E. g. возьмите блок go в L4: предположим, что 'c' блокирует put. 'fastest' делает второй набор, который не потребляется. Когда именно, в приведенном выше примере кода есть 'c', а канал, возвращаемый' самым быстрым' мусором, собран? –