स्विफ्ट में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर
\n\niOS और macOS के लिए आधुनिक एप्लिकेशन उच्च प्रदर्शन और इंटरफ़ेस की प्रतिक्रियाशीलता की मांग करते हैं। स्विफ्ट में समवर्तीता के साथ उन्नत कार्य Grand Central Dispatch (GCD) के सरल उपयोग से कहीं आगे जाता है। इस लेख में, हम अतुल्यकालिक कार्यों को प्रबंधित करने के लिए Swift 5.5+ के प्रमुख उपकरणों की समीक्षा करेंगे: async/await, Actors, TaskGroup और प्रोटोकॉल Sendable। आप सीखेंगे कि डेटा रेस से कैसे बचें, मल्टीथ्रेडेड कोड को सही ढंग से कैसे संरचित करें और प्रदर्शन को कैसे अनुकूलित करें।
1. async/await और Structured Concurrency की मूल बातें
\n\nकीवर्ड async और await स्विफ्ट में आधुनिक समवर्तीता का आधार हैं। वे अतुल्यकालिक कोड लिखने की अनुमति देते हैं जो तुल्यकालिक दिखता है, जो पढ़ने और डिबगिंग को काफी सरल बनाता है।
अतुल्यकालिक फ़ंक्शन घोषित करना:
\nfunc fetchUserData() async throws -> User {\n let url = URL(string: "https://api.example.com/user")!\n let (data, _) = try await URLSession.shared.data(from: url)\n let decoder = JSONDecoder()\n return try decoder.decode(User.self, from: data)\n}\n\nत्रुटि प्रबंधन के साथ अतुल्यकालिक फ़ंक्शन को कॉल करना:
\nTask {\n do {\n let user = try await fetchUserData()\n print("User name: \\(user.name)")\n } catch {\n print("Failed to fetch user: \\(error)")\n }\n}\n\nमहत्वपूर्ण बिंदु:
\n- \n
- Structured Concurrency: प्रत्येक अतुल्यकालिक कार्य का एक स्पष्ट जीवनकाल होता है, जो मूल
Taskके दायरे तक सीमित होता है। \n - कार्य रद्द करना: मूल Task को रद्द करने पर चाइल्ड कार्यों का स्वचालित रद्दीकरण। \n
- प्राथमिकताएँ: उपयोगकर्ता के लिए महत्वपूर्ण कार्यों के लिए
Task(priority: .userInitiated)का उपयोग करें। \n
2. Actors: डेटा रेस से सुरक्षा
\n\nSwift 5.5 से पहले, डेवलपर्स साझा स्थिति की सुरक्षा के लिए अक्सर GCD की क्रमबद्ध कतारों का उपयोग करते थे। Actors अंतर्निहित अलगाव प्रदान करते हैं: actor की स्थिति तक पहुँच केवल await के माध्यम से संभव है, जो कंपाइलर स्तर पर थ्रेड सुरक्षा की गारंटी देता है।
बैंक खाते के लिए Actor का उदाहरण:
\nactor BankAccount {\n private var balance: Double = 0.0\n\n func deposit(amount: Double) {\n balance += amount\n }\n\n func withdraw(amount: Double) throws {\n guard balance >= amount else {\n throw BankError.insufficientFunds\n }\n balance -= amount\n }\n\n func getBalance() -> Double {\n return balance\n }\n}\n\n// उपयोग\nlet account = BankAccount()\nTask {\n await account.deposit(amount: 100.0)\n let currentBalance = await account.getBalance()\n print("Balance: \\(currentBalance)")\n}\n\nActors के लाभ:
\n- \n
- कंपाइलर जाँच:
awaitके बिना actor की संपत्ति तक पहुँचने का प्रयास संकलन त्रुटि उत्पन्न करेगा। \n - पुनः प्रवेश (Reentrancy): Actor वर्तमान विधि के निष्पादन को रोक सकता है (उदाहरण के लिए, actor के अंदर
awaitपर) और दूसरी कॉल को संसाधित कर सकता है, जो डेडलॉक को रोकता है। \n - प्रदर्शन: Actors अनुकूलित सिंक्रनाइज़ेशन तंत्र का उपयोग करते हैं, जो अक्सर मैन्युअल लॉक से तेज़ होते हैं। \n
3. TaskGroup: डेटा का समानांतर प्रसंस्करण
\n\nजब कई स्वतंत्र अतुल्यकालिक संचालन करने और उनके पूरा होने की प्रतीक्षा करने की आवश्यकता होती है, तो TaskGroup एक आदर्श उपकरण है। यह स्वचालित रूप से समानांतर कार्यों की संख्या का प्रबंधन करता है और परिणाम एकत्र करता है।
समानांतर में कई छवियाँ डाउनलोड करने का उदाहरण:
\nfunc downloadImages(urls: [URL])