थ्रेडिंग सबसे आसान समाधान होने की संभावना है, लेकिन यह एक एकल थ्रेड पर यह अपने आप का प्रबंधन करने के लिए बहुत मुश्किल नहीं है। "सिमुलेशन" वातावरण जो आपको केवल 100ms देते हैं, वे किसी भी नए धागे की अनुमति नहीं देते हैं, इसलिए यह एक विकल्प है।
मूल विचार यह है कि कार्य को पूरा करने के लिए किए जाने वाले कार्यों का प्रतिनिधित्व करने के लिए एक बंदरगाह बनाना है, और परिणामस्वरूप इसके परिणामस्वरूप यदि आपके पास समाप्त होने का समय नहीं है। यहां एक स्केच है: यह संख्याओं का अनुक्रम जोड़ता है, और प्रत्येक 100ms के बजाय हर दस संचालन में बाधा डालता है।
(let [timer (atom 9)]
(defn keep-going? []
(not= 0 (swap! timer #(mod (inc %) 10)))))
(defn saving-addition [sum xs]
(if-let [[x & more] (seq xs)]
(let [next-thunk (fn [] (saving-addition (+ x sum) more))]
(if (keep-going?)
(next-thunk)
next-thunk))
sum))
(defn monitor [xs]
(loop [thunk (saving-addition 0 xs)]
(if (fn? thunk)
(do
(println "Saving execution state")
(recur (thunk)))
thunk)))
user> (monitor (range 25))
Saving execution state
Saving execution state
Saving execution state
300
संपादित करें: क्योंकि Clojure, पूंछ-कॉल अनुकूलन नहीं है एक thunk बनाने और फिर बुला यह ढेर उपयोग करता है। यदि, संभवतः, आप बाधित होने से पहले कुछ हज़ार चरणों से अधिक निष्पादित करने में सक्षम हैं, तो आपको एक स्टैक ओवरफ़्लो मिलेगा। केवल यथार्थवादी समाधान दोनों एक recur
में और निरंतरता में thunk के शरीर नकल करने, जैसे
(defn saving-addition [sum xs]
(if-let [[x & more] (seq xs)]
(let [sum (+ x sum)]
(if (keep-going?)
(recur sum more)
#(saving-addition sum more)))
sum))
है आप कर सकते थे शायद किसी मैक्रो के साथ इस बाहर सार यदि आप कई तरह के "suspendable" कार्यों लिखना पड़ा।
पेड़ को हल नहीं किया गया है? आपको बस कुछ तत्व ढूंढने की आवश्यकता है और यदि आप इसे प्राप्त करते हैं तो सत्य वापस आते हैं, या आपको पथ की भी आवश्यकता है? – toto2