स्विफ्ट में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

स्विफ्ट में समवर्तीता और मल्टीथ्रेडिंग: उन्नत स्तर

\n\n

iOS और macOS के लिए आधुनिक एप्लिकेशन उच्च प्रदर्शन और इंटरफ़ेस की प्रतिक्रियाशीलता की मांग करते हैं। स्विफ्ट में समवर्तीता के साथ उन्नत कार्य Grand Central Dispatch (GCD) के सरल उपयोग से कहीं आगे जाता है। इस लेख में, हम अतुल्यकालिक कार्यों को प्रबंधित करने के लिए Swift 5.5+ के प्रमुख उपकरणों की समीक्षा करेंगे: async/await, Actors, TaskGroup और प्रोटोकॉल Sendable। आप सीखेंगे कि डेटा रेस से कैसे बचें, मल्टीथ्रेडेड कोड को सही ढंग से कैसे संरचित करें और प्रदर्शन को कैसे अनुकूलित करें।

\n\n

1. async/await और Structured Concurrency की मूल बातें

\n\n

कीवर्ड async और await स्विफ्ट में आधुनिक समवर्तीता का आधार हैं। वे अतुल्यकालिक कोड लिखने की अनुमति देते हैं जो तुल्यकालिक दिखता है, जो पढ़ने और डिबगिंग को काफी सरल बनाता है।

\n\n

अतुल्यकालिक फ़ंक्शन घोषित करना:

\n
func 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

त्रुटि प्रबंधन के साथ अतुल्यकालिक फ़ंक्शन को कॉल करना:

\n
Task {\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
\n\n

2. Actors: डेटा रेस से सुरक्षा

\n\n

Swift 5.5 से पहले, डेवलपर्स साझा स्थिति की सुरक्षा के लिए अक्सर GCD की क्रमबद्ध कतारों का उपयोग करते थे। Actors अंतर्निहित अलगाव प्रदान करते हैं: actor की स्थिति तक पहुँच केवल await के माध्यम से संभव है, जो कंपाइलर स्तर पर थ्रेड सुरक्षा की गारंटी देता है।

\n\n

बैंक खाते के लिए Actor का उदाहरण:

\n
actor 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\n

Actors के लाभ:

\n
    \n
  • कंपाइलर जाँच: await के बिना actor की संपत्ति तक पहुँचने का प्रयास संकलन त्रुटि उत्पन्न करेगा।
  • \n
  • पुनः प्रवेश (Reentrancy): Actor वर्तमान विधि के निष्पादन को रोक सकता है (उदाहरण के लिए, actor के अंदर await पर) और दूसरी कॉल को संसाधित कर सकता है, जो डेडलॉक को रोकता है।
  • \n
  • प्रदर्शन: Actors अनुकूलित सिंक्रनाइज़ेशन तंत्र का उपयोग करते हैं, जो अक्सर मैन्युअल लॉक से तेज़ होते हैं।
  • \n
\n\n

3. TaskGroup: डेटा का समानांतर प्रसंस्करण

\n\n

जब कई स्वतंत्र अतुल्यकालिक संचालन करने और उनके पूरा होने की प्रतीक्षा करने की आवश्यकता होती है, तो TaskGroup एक आदर्श उपकरण है। यह स्वचालित रूप से समानांतर कार्यों की संख्या का प्रबंधन करता है और परिणाम एकत्र करता है।

\n\n

समानांतर में कई छवियाँ डाउनलोड करने का उदाहरण:

\n
func downloadImages(urls: [URL])                

ब्लॉग

पुस्तक अनुशंसाएँ