मैंने क्लोजर में कुछ कोर.एसिंक कोड लिखा और जब मैंने इसे चलाया तो यह सभी उपलब्ध स्मृति का उपभोग करता था और एक त्रुटि के साथ विफल रहा। ऐसा लगता है कि कोर.एसिंक पाइपलाइन में mapcat
का उपयोग करके वापस दबाव टूट जाता है। (जो इस सवाल के दायरे से परे कारणों के लिए दुर्भाग्य की बात है।)मैपकैट core.async में बैकप्रेसर तोड़ने पर मेमोरी रिसाव कहां है?
यहाँ कुछ कोड है कि अंदर और बाहर :x
रों की गणना के द्वारा समस्या को दर्शाता है है एक mapcat
ing ट्रांसड्यूसर की:
(ns mapcat.core
(:require [clojure.core.async :as async]))
(defn test-backpressure [n length]
(let [message (repeat length :x)
input (async/chan)
transform (async/chan 1 (mapcat seq))
output (async/chan)
sent (atom 0)]
(async/pipe input transform)
(async/pipe transform output)
(async/go
(dotimes [_ n]
(async/>! input message)
(swap! sent inc))
(async/close! input))
(async/go-loop [x 0]
(when (= 0 (mod x (/ (* n length) 10)))
(println "in:" (* @sent length) "out:" x))
(when-let [_ (async/<! output)]
(recur (inc x))))))
=> (test-backpressure 1000 10)
in: 10 out: 0
in: 2680 out: 1000
in: 7410 out: 2000
in: 10000 out: 3000 ; Where are the other 7000 characters?
in: 10000 out: 4000
in: 10000 out: 5000
in: 10000 out: 6000
in: 10000 out: 7000
in: 10000 out: 8000
in: 10000 out: 9000
in: 10000 out: 10000
निर्माता दौड़ दूर उपभोक्ता से आगे
ऐसा प्रतीत होता है कि मैं इसे खोजने वाला पहला व्यक्ति नहीं हूं। लेकिन here दिए गए स्पष्टीकरण को इसमें शामिल नहीं किया गया है। (हालांकि यह पर्याप्त कामकाज प्रदान करता है।) संकल्पनात्मक रूप से, मैं उम्मीद करता हूं कि निर्माता आगे बढ़ेगा, लेकिन केवल कुछ संदेशों की लंबाई से जो चैनलों में बफर किए जा सकते हैं।
मेरा सवाल है, अन्य सभी संदेश कहां हैं? आउटपुट की चौथी लाइन 7000 :x
एस के लिए अनचाहे हैं।
आपके द्वारा दिए गए लिंक में, एलेक्स ने उल्लेख किया कि यह गलत परिणाम और बफर-सीमा-उल्लंघन के बीच एक दुविधा है। स्पष्ट रूप से [ASYNC-124] (http://dev.clojure.org/jira/browse/ASYNC-124) एक सही उत्तर – Davyzhu
पसंद करता है तो, आपके प्रश्न के संबंध में, अन्य संदेश संदर्भित 'लेकर्स' में होल्डिंग हो सकते हैं [यहां ] (https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/channels.clj#L86)। इसके बारे में इतना यकीन नहीं है तो आइए अधिक आत्मविश्वास के उत्तर की प्रतीक्षा करें। – Davyzhu