2012-06-11 5 views
39

मैं एक मामूली जटिल आईओएस प्रोग्राम लिख रहा हूं जिसमें इसके कुछ लंबे परिचालनों (पार्सिंग, नेटवर्क से कनेक्शन ... आदि) के लिए कई धागे होने की आवश्यकता है। हालांकि, मैं उलझन में हूं कि dispatch_get_global_queue और dispatch_queue_create के बीच क्या अंतर है।dispatch_get_global_queue और dispatch_queue_create के बीच क्या अंतर है?

मुझे किस का उपयोग करना चाहिए और क्या आप मुझे सामान्य रूप से अंतर का एक सरल स्पष्टीकरण दे सकते हैं? धन्यवाद।

+1

हां .. यू गलत जवाब उठाया। रॉबर्ट रयान का जवाब अधिक उपयुक्त है –

उत्तर

68

documentation वर्णन करता है, एक वैश्विक कतार समवर्ती कार्यों के लिए अच्छा है (यानी आप असीमित रूप से विभिन्न कार्यों को प्रेषित करने जा रहे हैं और यदि आप एक साथ चलते हैं तो आप पूरी तरह खुश हैं) और यदि आप सैद्धांतिक रूप से सामना नहीं करना चाहते हैं अपनी खुद की कतार बनाने और नष्ट करने के ऊपर।

यदि आपको सीरियल कतार की आवश्यकता है तो अपनी खुद की कतार का निर्माण बहुत उपयोगी है (यानी आपको प्रेषित ब्लॉक को एक समय में निष्पादित करने की आवश्यकता है)। यह कई परिदृश्यों में उपयोगी हो सकता है, जैसे कि जब प्रत्येक कार्य पिछले एक पर निर्भर करता है या एकाधिक धागे से कुछ साझा संसाधनों के साथ बातचीत समन्वयित करता है।

कम आम है, लेकिन यदि आप एक समवर्ती कतार के साथ barriers का उपयोग करने की आवश्यकता है तो आप अपनी खुद की कतार भी बनाना चाहेंगे। उस परिदृश्य में, DISPATCH_QUEUE_CONCURRENT विकल्प के साथ एक समवर्ती कतार (यानी dispatch_queue_create) बनाएं और उस कतार के साथ बाधाओं का उपयोग करें। आपको वैश्विक कतारों पर बाधाओं का कभी भी उपयोग नहीं करना चाहिए।

मेरा सामान्य वकील यह है कि यदि आपको सीरियल कतार (या बाधाओं का उपयोग करने की आवश्यकता है) की आवश्यकता है, तो एक कतार बनाएं। यदि आप नहीं करते हैं, तो आगे बढ़ें और वैश्विक कतार का उपयोग करें और अपना खुद का निर्माण करने के ऊपरी हिस्से को बाईपास करें।


आप एक समवर्ती कतार चाहते हैं, लेकिन नियंत्रित करने के लिए कितने संचालन समवर्ती चला सकते हैं चाहते हैं, आप भी NSOperationQueue जो एक maxConcurrentOperationCount संपत्ति है उपयोग करने पर विचार कर सकते हैं। नेटवर्क ऑपरेशंस करते समय यह उपयोगी हो सकता है और आप अपने सर्वर पर बहुत से समवर्ती अनुरोध सबमिट नहीं करना चाहते हैं।

+2

हालांकि ध्यान दें कि शेर में अब 'DISPATCH_QUEUE_CONCURRENT' पास करके' dispatch_queue_create() 'से समवर्ती कतार प्राप्त करना संभव है। यह निर्दिष्ट नहीं है (और शायद कोई फर्क नहीं पड़ता) क्या यह मौजूदा वैश्विक कतारों में से एक को वापस कर देगा। –

+1

मुझे जोड़ा जाना चाहिए था, "संभवतः कार्यक्षमता आईओएस में आ रही है"। –

+1

समवर्ती और धारावाहिक कतारों की अवधि में मतभेदों को सही ढंग से इंगित करने के लिए उपरोक्त। – user523234

0

एक मौजूदा वैश्विक कतार लौटाता है, दूसरा एक नया बनाता है। जीसीडी का उपयोग करने के बजाय, मैं NSOperation और ऑपरेशन कतार का उपयोग करने पर विचार करता हूं। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं in this guide. आमतौर पर, आप चाहते हैं कि आपरेशन एक साथ निष्पादित करें, आप अपनी खुद की कतार बनाना चाहते हैं और अपने परिचालनों को इसमें रखना चाहते हैं।

+0

बस स्पष्टीकरण के लिए, यदि आप एक प्रेषण कतार बना रहे हैं, तो यह धारावाहिक है। यदि आप वैश्विक प्रेषण कतार का उपयोग कर रहे हैं, तो यह समवर्ती हो सकता है (लेकिन ऐसा होने की गारंटी नहीं है)। मुझे लगता है कि समेकन के लिए कतार बनाने के लिए आपकी सलाह फिर से चल रही कतारों से संबंधित है, कतार प्रेषण नहीं है। (मुझे पता है कि आप जानते हैं, लेकिन मैं सिर्फ यह सुनिश्चित करना चाहता था कि पाठकों को भ्रमित न किया जाए।) – Rob

+1

हां, मैं ऑपरेशन कतारों के बारे में बात कर रहा हूं। मुझे कुछ समय पहले एक ही समस्या का सामना करना पड़ रहा था, और जब मैंने अपनी खुद की ऑपरेशन कतार बिना किसी कॉन्फ़िगरेशन के बनाई, तो इसमें जोड़े गए ऑपरेशन एक दूसरे के साथ एक साथ निष्पादित किए गए। –

40

बस एक अलग जवाब में पोस्ट किया, लेकिन यहाँ कुछ मैं काफी देर वापस लिखा है:

कतारों पहले एहसास है कि बहुत कम स्तर पर है, वहाँ केवल दो प्रकार के होते हैं, की अवधारणा का सबसे अच्छा तरीका कतार: धारावाहिक और समवर्ती।

सीरियल कतार एकरूप हैं, लेकिन असामान्य हैं। यदि आप प्रत्येक सीरियल कतार में कार्यों का एक गुच्छा देते हैं, तो यह एक समय में केवल एक ही थ्रेड का उपयोग करके उन्हें एक बार चलाएगा। असामान्य पहलू यह है कि धारावाहिक कतार कार्यों के बीच एक अलग थ्रेड पर स्विच कर सकते हैं। सीरियल कतार हमेशा अगले कार्य पर जाने से पहले एक कार्य खत्म होने की प्रतीक्षा करते हैं। इस प्रकार कार्य एफआईएफओ आदेश में पूरा हो गए हैं। आप dispatch_queue_create के साथ जितनी आवश्यकता हो उतनी सीरियल कतार बना सकते हैं।

मुख्य कतार एक विशेष धारावाहिक कतार है। अन्य धारावाहिक कतारों के विपरीत, जो कि असामान्य हैं, उनमें वे कई धागे "डेटिंग" कर रहे हैं, लेकिन समय पर केवल एक ही, मुख्य कतार मुख्य धागे पर "विवाहित" है और सभी कार्यों को इस पर किया जाता है।मुख्य कतार में नौकरी को रनलोप के साथ अच्छी तरह से व्यवहार करने की आवश्यकता है ताकि छोटे ऑपरेशन यूआई और अन्य महत्वपूर्ण बिट्स को अवरुद्ध न करें। सभी धारावाहिक कतारों की तरह, एफआईएफओ आदेश में कार्य पूरा हो जाते हैं।

यदि सीरियल कतार एकरूप हैं, तो समवर्ती कतार विचित्र हैं। वे किसी भी उपलब्ध थ्रेड पर कार्यों को सबमिट करेंगे या सिस्टम लोड के आधार पर नए धागे भी बनाएंगे। वे अलग-अलग धागे पर एक साथ कई कार्य कर सकते हैं। यह महत्वपूर्ण है कि वैश्विक कतार में सबमिट किए गए कार्य थ्रेड-सुरक्षित हैं और साइड इफेक्ट्स को कम करते हैं। कार्य एफआईएफओ आदेश में निष्पादन के लिए जमा किए जाते हैं, लेकिन पूरा होने का आदेश गारंटी नहीं है। इस लेखन के अनुसार, केवल तीन समवर्ती कतार हैं और आप उन्हें नहीं बना सकते हैं, आप उन्हें केवल dispatch_get_global_queue के साथ ला सकते हैं।

संपादित: ब्लॉग पोस्ट इस जवाब पर विस्तार: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

+2

बेस्ट। उत्तर। कभी। –

+1

ब्लॉग पोस्ट लिंक मर चुका है। –

+0

अभी भी मेरे लिए काम करना प्रतीत होता है। मैंने हाल ही में ब्लॉग इंजन अपडेट किए हैं, इसलिए यहां एक नया कैनोलिक पता है: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html – amattn