2011-12-07 10 views
8

में मानक आउटपुट का सिंक्रनाइज़ेशन मेरे पास क्लोजर में एक बहुप्रचारित एप्लिकेशन लिखा गया है। एकाधिक थ्रेड STDOUT को लिखते समय कंसोल में टेक्स्ट बनाने की समस्या ठीक से होती है। क्लोजर में मैं इसे सही तरीके से कैसे कर सकता हूं, इसलिए लाइनें अंतःस्थापित नहीं दिखाई देगी? मुझे लगता है कि इसमें किसी प्रकार का अलग आईओ एजेंट शामिल होगा, लेकिन मुझे सच में यकीन नहीं है कि यह कैसे करें।क्लोजर

उत्तर

9

मुझे लगता है यह अलग आईओ एजेंट

किसी तरह हाँ, वह काम करना चाहिए शामिल होगा। एक एजेंट (def printer (agent nil)) बनाएं और उचित print कथन के साथ कॉल करें, उदाहरण के लिए, (send printer #(println msg))। संदेशों को एक कतार में रखा जाता है और एक समय में एक (असीमित रूप से) निष्पादित किया जाता है।

लॉगिंग उद्देश्यों के लिए आप tools.logging पर भी देख सकते हैं जो हुड के नीचे एजेंटों का उपयोग करता है।

+0

यह काम करता है, सिवाय इसके कि मुझे किसी अन्य फ़ंक्शन प्रॉक्सी के माध्यम से एजेंट को प्रिंट जॉब भेजना है। सीधे एजेंट को प्रिंटल भेजना कुछ कारणों से काम नहीं करेगा। – bvk256

+0

क्लोजर की वेबसाइट पर [इस आलेख] (http://clojure.org/agents) में, यह कहता है: "किसी अन्य एजेंट से एकल एजेंट या थ्रेड ** से भेजे गए कार्यों को क्रम में किया जाएगा भेजा गया, ** संभावित रूप से interleaved ** अन्य स्रोतों से ** एक ही एजेंट ** प्रेषित कार्यों के साथ **। " क्या इसका मतलब यह है कि अभी भी समस्या हो सकती है जब "** एकाधिक धागे ** STDOUT को लिखते हैं"? –