2012-07-14 11 views
5

मैं की तरहNondeterministically इंटरलिविंग नाली के सूत्रों का कहना है

interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a) 

उपयोग के मामले में प्रकार हस्ताक्षर के साथ स्रोतों के लिए एक गैर नियतात्मक इंटरलिविंग आपरेशन को देखने के लिए, उम्मीद थी कि मैं एक p2p अनुप्रयोग है कि पर कई नोड्स के लिए खुला सम्बन्ध बनाये रखते है नेटवर्क, और यह ज्यादातर उनमें से किसी के संदेशों के इंतजार के आसपास बस बैठे हैं। जब कोई संदेश आता है, तो यह परवाह नहीं करता कि यह कहां से आया था, लेकिन जितनी जल्दी हो सके संदेश को संसाधित करने की आवश्यकता है। सिद्धांत रूप में इस तरह के आवेदन (कम से कम जब सॉकेट जैसी स्रोतों के लिए उपयोग किया जाता है) जीएचसी के आईओ मैनेजर को पूरी तरह से बाईपास कर सकता है और select/epoll/आदि चला सकता है। सीधे कॉल करता है, लेकिन जब तक यह काम करता है, तब तक मुझे विशेष रूप से परवाह नहीं है कि यह कैसे कार्यान्वित किया जाता है।

क्या यह कंड्यूट के साथ ऐसा कुछ संभव है? एक कम सामान्य लेकिन शायद अधिक व्यवहार्य दृष्टिकोण [(k, Socket)] -> Source m (k, ByteString) फ़ंक्शन लिखना हो सकता है जो आपके लिए सभी सॉकेट पर प्राप्त करता है।

मैं नाली में ResumableSource संचालन देखा, लेकिन वे सभी एक विशेष Sink है, जो इस कार्रवाई के लिए एक अमूर्त रिसाव का एक सा की तरह लगता है, कम से कम के बारे में पता होना चाहता हूँ करने लगते हैं।

+0

फोर्कियो और एक चैन/टीसीएचएन को लपेटने वाले स्रोत का उपयोग करके सरल समाधान की तुलना में आपको कितनी तेजी से आवश्यकता है? –

+0

मुझे जरूरी नहीं कि उच्च प्रदर्शन की आवश्यकता है (मुझे उम्मीद है कि इनमें से लगभग 1000 से अधिक सहकर्मियों को जोड़ने की उम्मीद है) लेकिन मैं आमतौर पर इन इटरेटे-जैसे अवशेषों में दिलचस्पी लेता हूं और सोच रहा था कि इस तरह के ऑपरेशन को प्रदान करना संभव था या नहीं conduits के साथ। यह कुछ प्रकार के नेटवर्क प्रोटोकॉल के लिए एक सामान्य रूप से सामान्य उपयोग मामले की तरह लगता है। – copumpkin

+0

मेरा मानना ​​है कि इवेंट मैनेजर करीब के करीब है जैसा कि आप सीधे 'चयन' या 'एपोल' का उपयोग किए बिना या कुछ पैकेज के माध्यम से प्राप्त करेंगे। मुझे नहीं लगता कि इवेंट मैनेजर से एक मतदान इंटरफ़ेस सामने आया है (यदि यह किया गया तो यह एक ईवेंट मैनेजर का अधिक नहीं होगा) ताकि आप किसी भी तरह के अधिकांश डिज़ाइनों के साथ कुछ थ्रेड और चैन के साथ समाप्त हो जाएंगे। मैं जो करता हूं वह एक 'स्रोत' से शुरू होता है जो एक बाध्य 'टीसीएचएन' लपेटता है, शुरुआत में प्रति थ्रेड को थ्रेड करता है। यदि प्रदर्शन के लिए आवश्यक है तो ईवेंट मैनेजर पर जाएं।यदि आपको अभी भी समस्याएं आ रही हैं तो हमेशा एफएफआई होती है। –

उत्तर

5

एसटीएम-कंडिट पैकेज mergeSources प्रदान करता है जो कुछ समान करता है- हालांकि समान नहीं है- जो आप खोज रहे हैं। यह शुरू करने के लिए शायद एक अच्छी जगह है।

+1

माइकल के जवाब को स्वीकार करें। यह मैंने जो किया है वह करता है। –

+0

क्या कोई इस बात का विस्तार कर सकता है कि 'मर्ज स्रोत' का प्रकार किसी स्रोत 'मोनाड रिसोर्स' इंस्टेंस के बजाय 'स्रोत' के रूप में स्रोत के मानदंड के मोनड तर्क को बाधित करता है? –

+1

मुझे कोई कारण नहीं दिख रहा है, यह रखरखाव के साथ एक समस्या दर्ज करने लायक है। 'Hoist liftResourceT' का उपयोग करके 'mergeSources' को कॉल करते समय आप इसे स्वयं ठीक कर सकते हैं। –

3

हां, यह संभव है।

आप धागे forking जहां प्रत्येक सूत्र में आप एक Sink कि कुछ संगामिति चैनल में आउटपुट भेजता है के साथ Source जोड़ी सर्वेक्षण करना द्वारा रोके बिना Source रों का एक समूह मतदान कर सकते हैं:

concur :: (WhateverIOMonadClassItWouldWant m) => TChan a -> Sink a m r 

... और फिर आप एक Source कि उस चैनल से पढ़ता निर्धारित करें:

synchronize :: (WhateverIOMonadClassItWouldWant m) => TChan a -> Source a m r 

सूचना कि यह सिर्फ सॉकेट खुद को मतदान पर धागे forking से अलग नहीं होगा, लेकिन यह conduit के अन्य उपयोगकर्ताओं के लिए उपयोगी होगा जो Source एस का उपयोग करके सॉकेट की तुलना में अन्य चीजों को मतदान करना चाहेंगे क्योंकि यह अधिक सामान्य है।

आप एक समारोह में उन क्षमताओं संयुक्त है, तो कॉल के समग्र एपीआई कुछ ऐसा दिखाई देगा:

poll :: (WhateverIOMonadClassItWouldWant m) => [Source a m r] -> m (Source a m r) 

... लेकिन आप अभी भी उन k रों में फेंक अगर आप चाहते हैं कर सकते हैं।

संबंधित मुद्दे