के रूप में डेटा प्रोसेसिंग का प्रतिनिधित्व करने के लिए ढांचे, अधिकांश डेटा प्रोसेसिंग को घटकों की पाइपलाइन के रूप में देखा जा सकता है, एक दूसरे के इनपुट में भोजन करने का उत्पादन। एक ठेठ प्रसंस्करण पाइप लाइन है:पाइपलाइन
reader | handler | writer
एक पन्नी के रूप में यह चर्चा शुरू करने के लिए, चलो इस पाइपलाइन जहां प्रत्येक खंड एक वस्तु है की एक वस्तु उन्मुख कार्यान्वयन पर विचार करें। handler
वस्तु दोनों reader
और writer
वस्तुओं के संदर्भ हैं और एक run
विधि है जो लगता है कि है:
define handler.run:
while (reader.has_next) {
data = reader.next
output = ...some function of data...
writer.put(output)
}
रेखाचित्र के रूप में निर्भरता हैं:
reader <- handler -> writer
अब मान लीजिए कि मैं एक नई पाइपलाइन खंड लगाना चाहता हूँ पाठक और हैंडलर के बीच:
reader | tweaker | handler | writer
फिर से, इस ओओ में कार्यान्वयन, tweaker
reader
वस्तु के चारों ओर एक आवरण होगा, और tweaker
तरीकों की तरह कुछ लग सकता है (कुछ छद्म जरूरी कोड में):
define tweaker.has_next:
return reader.has_next
define tweaker.next:
value = reader.next
result = ...some function of value...
return result
मैं खोजने कर रहा हूँ कि यह एक बहुत composable अमूर्त नहीं है। कुछ मुद्दे हैं:
tweaker
केवलhandler
के बाएं हाथ की ओर इस्तेमाल किया जा सकता है, यानी मैं इस पाइप लाइन के लिए फार्मtweaker
के ऊपर कार्यान्वयन का उपयोग नहीं कर सकते हैं:पाठक | हैंडलर | ट्वीकर | लेखक
मैं, पाइपलाइनों के साहचर्य संपत्ति का दोहन करना चाहते हैं तो यह पाइपलाइन कि:
पाठक | हैंडलर | लेखक
व्यक्त किया जा सकता है:
reader | p
जहां p
पाइपलाइन handler | writer
है। इस OO कार्यान्वयन में मैं आंशिक रूप से handler
वस्तु का दृष्टांत को
- की (1), वस्तुओं एक पुन: कथन की कुछ हद तक पता करने के लिए होता है, तो वे "पुश" या "पुल" डेटा।
मैं डेटा प्रोसेसिंग पाइपलाइन बनाने के लिए एक ढांचा (अनिवार्य रूप से ओओ) की तलाश में हूं जो इन मुद्दों को संबोधित करता है।
मैंने इसे Haskell
और functional programming
के साथ टैग किया है क्योंकि मुझे लगता है कि कार्यात्मक प्रोग्रामिंग अवधारणाएं यहां उपयोगी हो सकती हैं।
एक लक्ष्य के रूप में, यह इस तरह से एक पाइप लाइन बनाने के लिए सक्षम होने के लिए अच्छा होगा:
handler1
/ \
reader | partition writer
\ /
handler2
कुछ परिप्रेक्ष्य के लिए, यूनिक्स शेल पाइप निम्नलिखित कार्यान्वयन निर्णय के साथ इन समस्याओं का एक बहुत हल करती है:
पाइपलाइन घटक अलग प्रक्रियाओं
पाइप वस्तुओं में अतुल्यकालिक रूप से चलाने के "pushers" और "pulle के बीच डेटा गुजर मध्यस्थता रु "; यानी वे लेखकों को अवरुद्ध करते हैं जो डेटा बहुत तेजी से लिखते हैं और पाठक जो बहुत तेज़ी से पढ़ने की कोशिश करते हैं।
आप पाइपलाइन
मैं विशेष रूप से दृष्टिकोण जो सूत्रण या एजेंटों के बीच संदेश-गुजर उपयोग नहीं करते हैं में दिलचस्पी के लिए निष्क्रिय घटकों (अर्थात फ़ाइलें) कनेक्ट करने के लिए विशेष कनेक्टर्स <
और >
का उपयोग करें। शायद यह करने का सबसे अच्छा तरीका है, लेकिन यदि संभव हो तो मैं थ्रेडिंग से बचना चाहता हूं।
धन्यवाद!
http://www.haskell.org/arrows –
पर एक नज़र डालें, शायद आप कुछ पाठक, एक पाठक, ट्वीकर, हैंडलर और लेखक के लिए एक थ्रेड बनाना चाहते हैं, और [चान की ' ] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-Chan.html)? मुझे 100% यकीन नहीं है कि मैं समझता हूं कि शीर्ष-स्तर का सवाल क्या है, हालांकि ... –
अभी तक, अंतिम चित्र 'पाठक >>> विभाजन >>> हैंडलर 1 *** हैंडलर 2 >>> लेखक' जैसा दिखता है, लेकिन शायद कुछ जटिलताओं को और अधिक जटिल बनाने की आवश्यकता होगी। –