स्विफ्ट में कार्य कतारें: GCD से Swift Concurrency तक
\n\niOS और macOS के विकास में, कोड के समानांतर निष्पादन का प्रबंधन एक प्रमुख कार्य है। कार्य कतारें (queues) उपयोगकर्ता इंटरफ़ेस को ब्लॉक किए बिना, थ्रेड्स के बीच लोड को कुशलतापूर्वक वितरित करने की अनुमति देती हैं। इस गाइड में, हम तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे: क्लासिक Grand Central Dispatch (GCD), एब्स्ट्रैक्शन OperationQueue, और आधुनिक तंत्र Swift Concurrency (async/await)।
\n\n1. Grand Central Dispatch (GCD) — समानांतरता का आधार
\n\nGCD एक निम्न-स्तरीय C लाइब्रेरी है, जो स्विफ्ट में एकीकृत है। यह थ्रेड पूल का प्रबंधन करती है और दो प्रकार की कतारें प्रदान करती है:
\n\n- \n
- Serial (अनुक्रमिक) — कार्य जोड़ने के क्रम में एक के बाद एक निष्पादित होते हैं। \n
- Concurrent (समानांतर) — कार्य एक साथ शुरू होते हैं, पूर्ण होने का क्रम गारंटीकृत नहीं है। \n
कतार बनाने और उपयोग करने का उदाहरण:
\n\nimport Foundation\n\n// एक अनुक्रमिक कतार बनाएँ\nlet serialQueue = DispatchQueue(label: "com.example.serial")\n\nserialQueue.async {\n print("कार्य 1 शुरू हुआ")\n sleep(1)\n print("कार्य 1 पूर्ण हुआ")\n}\n\nserialQueue.async {\n print("कार्य 2 शुरू हुआ")\n sleep(1)\n print("कार्य 2 पूर्ण हुआ")\n}\n\n// समानांतर कतार\nlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)\n\nconcurrentQueue.async {\n print("समानांतर कार्य A")\n}\n\nconcurrentQueue.async {\n print("समानांतर कार्य B")\n}\n\nGCD की प्रमुख क्षमताएँ:
\n- \n
DispatchQueue.main— मुख्य कतार (UI थ्रेड)। \n DispatchQueue.global(qos: .userInitiated)— प्राथमिकता (QoS) के साथ वैश्विक कतारें। \n dispatchGroup— कई कार्यों का सिंक्रनाइज़ेशन। \n dispatchSemaphore— संसाधनों तक पहुँच का नियंत्रण। \n
2. OperationQueue — ऑब्जेक्ट-ओरिएंटेड एब्स्ट्रैक्शन
\n\nOperationQueue GCD के ऊपर बनाई गई है, लेकिन एक उच्च-स्तरीय API प्रदान करती है। मुख्य लाभ:
- \n
- संचालनों के बीच निर्भरता का प्रबंधन। \n
- कार्यों को रद्द करना (cancel)। \n
- स्थिति की निगरानी (isFinished, isExecuting)। \n
- समानांतर संचालनों की अधिकतम संख्या। \n
BlockOperation के साथ उदाहरण:
import Foundation\n\nlet operationQueue = OperationQueue()\noperationQueue.maxConcurrentOperationCount = 2\n\nlet operation1 = BlockOperation {\n print("संचालन 1: डेटा लोड हो रहा है")\n sleep(2)\n print("संचालन 1 पूर्ण हुआ")\n}\n\nlet operation2 = BlockOperation {\n print("संचालन 2: प्रसंस्करण")\n sleep(1)\n print("संचालन 2 पूर्ण हुआ")\n}\n\n// निर्भरता सेट करें: संचालन 2, संचालन 1 के पूर्ण होने के बाद ही शुरू होगा\noperation2.addDependency(operation1)\n\noperationQueue.addOperations([operation1, operation2], waitUntilFinished: false)\n\n// संचालन रद्द करना\noperation1.cancel()\n\nOperationQueue का उपयोग कब करें:
\n- \n
- निर्भरताओं के साथ जटिल कार्य श्रृंखलाएँ। \n
- सूक्ष्म नियंत्रण की आवश्यकता (रोकना, रद्द करना)। \n
- निगरानी के लिए KVO (Key-Value Observing) के साथ कार्य। \n
3. Swift Concurrency — आधुनिक दृष्टिकोण (iOS 13+, macOS 10.15+)
\n\nSwift 5.5 से शुरू करके, Apple ने async/await, Task और TaskGroup के माध्यम से एसिंक्रोनस प्रोग्रामिंग के लिए अंतर्निहित समर्थन प्रस्तुत किया। यह समानांतरता के साथ काम करने का अधिक सुरक्षित और पठनीय तरीका है।
मूल उदाहरण:
\n\nimport Foundation\n\nfunc fetchUserData() async -> String {\n // नेटवर्क अनुरोध का अनुकरण\n try? await Task.sleep(nanoseconds: 2 * 1_000_000_000)\n return "User data loaded"\n}\n\nfunc processData()