2010-11-13 16 views
5

सी # का उपयोग कर एक सच्ची फ़ंक्शन पाइपलाइन कैसे बनाएं? मैं इस प्रकार है जैसे कुछ विचार आया, लेकिन यह एक सच पाइपलाइनसी # में सही फ़ंक्शन पाइपलाइन को कैसे कार्यान्वित करें?

public static IEnumerable<T> ForEachPipeline<T>(this IEnumerable<T> source, params Func<T, T>[] pipeline) 
{ 
foreach (var element in source) { 
    yield return ExecutePipeline(element, pipeline); 
} 
} 

private static T ExecutePipeline<T>(T element, IEnumerable<Func<T, T>> jobs) 
{ 
var arg = element; 
T result = default(T); 
foreach (var job in jobs) { 
    result = job.Invoke(arg); 
    arg = result; 
} 
return result; 
} 

ऊपर कोड IEnumerable<T> के प्रत्येक तत्व पाइपलाइन के बाद ही पिछले तत्व सभी कार्यों को क्रियान्वित खत्म में प्राप्त करने में सक्षम हैं में नहीं है (यानी बाहर निकलता है पाइपलाइन), लेकिन परिभाषा के अनुसार element1func1 निष्पादित करने को समाप्त करता है और func2 निष्पादित करना प्रारंभ करता है, उस समय तक element2 को func1 निष्पादित करना प्रारंभ करना चाहिए और इस प्रकार पाइपलाइन में डेटा का प्रवाह जारी रखना जारी रखना चाहिए।

क्या इस तरह का परिदृश्य सी # में लागू करना संभव है? यदि संभव हो तो कृपया मुझे कुछ उदाहरण कोड दें।

+0

धागे को पेश किए जाने तक केवल एक ही निष्पादन संदर्भ होता है (एकल-धागे के साथ वैकल्पिक दृष्टिकोण केवल प्रत्येक चरण में गैर आलसी परिणाम निर्माण होता है)। धागे के साथ, प्रत्येक चरण केवल एक "पंप" के आसपास संदेशों को पास करने वाली फीफो कतार है। धागे (वास्तव में, समरूपता) जटिलता में भी काफी वृद्धि करते हैं, शायद .NET4 "समांतर" विधियों को देखते हैं। –

+0

मुझे धागे को पेश करने में कोई समस्या नहीं है, मुझे वैसे भी काम करने की ज़रूरत है .. कृपया कुछ विचार साझा करें –

+0

क्या PLINQ पहले से ही हल नहीं करेगा? http://msdn.microsoft.com/en-us/library/dd460688.aspx – bzlm

उत्तर

0

टिप्पणी से: धागे को पेश किए जाने तक केवल एक ही निष्पादन संदर्भ होता है (एकल-धागे के साथ वैकल्पिक दृष्टिकोण केवल प्रत्येक चरण में गैर आलसी परिणाम निर्माण होता है)। धागे के साथ, प्रत्येक चरण केवल एक "पंप" के आसपास संदेशों को पास करने वाली फीफो कतार है। धागे (वास्तव में, समरूपता) जटिलता में भी काफी वृद्धि करते हैं, शायद .NET4 "समांतर" विधियों को देखते हैं।

Parallel.ForEach का उपयोग करके एन "प्रारंभ" को कॉन्फ़िगर करने के लिए एक "आसान" विधि है - यदि केवल और यदि आप गारंटी दे सकते हैं कि गणनाएं दुष्प्रभाव मुक्त हैं।

संपादित करें: टिप्पणी देखें (ओं)।

+0

यह एक विचार था, लेकिन इस पैटर्न में मैं कैसे सुनिश्चित करूं कि परिणाम संख्यात्मक स्रोत स्रोत के समान क्रम में है? –

+1

@ अनन्द्य चटर्जी: 'समांतर' फोरएच 'का उपयोग करने के बजाय समांतर लिंक (पीआईएलक्यू) का उपयोग' समांतर अक्षय 'एक्सटेंशन विधियों के माध्यम से करें, जिसमें ['AsOrdered'] (http://msdn.microsoft.com/en-us/library शामिल है) /dd642142.aspx) ऑपरेटर आपके इनपुट ऑर्डरिंग को बनाए रखने के लिए। – Richard

0

यह व्यवहार एक वास्तविक पाइपलाइन से अधिक कुशल है। पाइपलाइनिंग केवल तभी समझ में आती है जब संचालन समानांतर में चलाया जा सके, लेकिन ये सभी नौकरियां एक एकल सीपीयू थ्रेड साझा कर रही हैं और इसलिए पाइपलाइन के बावजूद अनुक्रमिक रूप से निष्पादित करना आवश्यक है।

यदि आप समझते हैं कि कोई प्रदर्शन सुधार नहीं होगा और अभी भी पाइपलाइन करना चाहते हैं, तो एक टिप्पणी छोड़ दो और मैं दिखाऊंगा कि कैसे, लेकिन मैं पहले यह सुनिश्चित करना चाहता हूं कि आप जानते हैं कि आप क्या पूछ रहे हैं।

+0

आपको क्यों लगता है कि असली पाइपलाइन थ्रूपुट नहीं बढ़ाएगी? वैसे भी मुझे एक वास्तविक पाइपलाइन कार्यान्वयन देखने में बहुत दिलचस्पी है और मैं खुद को दोनों के थ्रूपुट की जांच करूंगा। –

0

मेरा मानना ​​है कि एक मुख्य वास्तुकला तत्व गुम है, चाहे नौकरी संभाली गई हो या नहीं। पाइपलाइन बहुत जिम्मेदारी के पारंपरिक GOF श्रृंखला के लिए समान है, यदि आप चारों ओर GOF किताब नहीं है यहाँ एक बार देख ले:

http://www.dofactory.com/Patterns/PatternChain.aspx#_self1

मुझे लगता है कि आपको कुछ इंटरफ़ेस करने के लिए अपने "टी" प्रतिबंधित करने के लिए है कि अगर नौकरी संभाली गई थी तो पाइपलाइन बताती है ("कहां" कथन का उपयोग करें)।

इसके अलावा, PLINQ ढांचे में एक नज़र डालें। मुझे पता है कि यह वही नहीं है जो आप खोज रहे हैं (वहां, इरादा समानांतर में कई नौकरियों को निष्पादित करना है), लेकिन यह आपको कुछ अच्छे विचार दे सकता है।

+0

यदि मैं इस पैटर्न को लागू करता हूं तो यह ऊपर वर्णित कोड जैसा ही होगा, वैसे भी यह एक वास्तविक पाइपलाइन नहीं होगा। –

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