Swift में समवर्तीता और मल्टीथ्रेडिंग का परिचय
\n\nआधुनिक मोबाइल और डेस्कटॉप एप्लिकेशन तेज़ और प्रतिक्रियाशील होने चाहिए। iOS और macOS डेवलपमेंट में, समवर्तीता और मल्टीथ्रेडिंग के उचित प्रबंधन की महत्वपूर्ण भूमिका होती है। Swift क्लासिक Grand Central Dispatch (GCD) से लेकर आधुनिक async/await मॉडल और एक्टर्स तक, समानांतर कार्य निष्पादन के लिए शक्तिशाली उपकरण प्रदान करता है।
\n\nइस लेख में, हम Swift में थ्रेड्स के साथ काम करने के सभी मुख्य दृष्टिकोणों पर चर्चा करेंगे: बुनियादी अवधारणाओं से लेकर उन्नत तकनीकों तक। आप सीखेंगे कि race conditions, deadlocks और मल्टीथ्रेडेड प्रोग्रामिंग की अन्य सामान्य समस्याओं से कैसे बचा जाए।
\n\nGrand Central Dispatch (GCD) — मल्टीथ्रेडिंग का क्लासिक
\n\nGrand Central Dispatch (GCD) कोड के समानांतर निष्पादन को प्रबंधित करने के लिए Apple की एक निम्न-स्तरीय लाइब्रेरी है। यह थ्रेड्स पर कार्यों को वितरित करने के लिए कतारों (dispatch queues) का उपयोग करती है।
\n\nकतारों के मुख्य प्रकार
\n\nGCD में दो मुख्य प्रकार की कतारें होती हैं:
\n\n- \n
- Serial queues (अनुक्रमिक): कार्य जोड़े जाने के क्रम में एक के बाद एक निष्पादित होते हैं। संसाधनों तक पहुँच को सिंक्रोनाइज़ करने के लिए आदर्श। \n
- Concurrent queues (समानांतर): कार्य एक साथ निष्पादित हो सकते हैं, पूर्णता का क्रम गारंटीड नहीं है। \n
GCD के साथ उदाहरण
\n\nimport Foundation\n\n// एक अनुक्रमिक कतार बनाएं\nlet serialQueue = DispatchQueue(label: "com.example.serial")\n\n// एक समानांतर कतार बनाएं\nlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)\n\n// अतुल्यकालिक निष्पादन\nserialQueue.async {\n print("कार्य 1 पृष्ठभूमि में निष्पादित हो रहा है")\n}\n\n// तुल्यकालिक निष्पादन (वर्तमान थ्रेड को ब्लॉक करता है)\nserialQueue.sync {\n print("कार्य 2 तुल्यकालिक रूप से निष्पादित हो रहा है")\n}\n\n// मुख्य थ्रेड के साथ कार्य\nDispatchQueue.main.async {\n print("मुख्य थ्रेड पर UI अपडेट करें")\n}\n\n// निष्पादन में विलंब\nDispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n print("2 सेकंड के बाद निष्पादित")\n}\n\nDispatch Group — कार्यों के समूह का सिंक्रोनाइज़ेशन
\n\nDispatch Group आपको अतुल्यकालिक कार्यों के एक समूह के पूरा होने को ट्रैक करने और उनके समाप्त होने के बाद कोड निष्पादित करने की अनुमति देता है।
\n\nlet group = DispatchGroup()\nlet queue = DispatchQueue.global(qos: .background)\n\nfor i in 1...5 {\n queue.async(group: group) {\n print("कार्य \\(i) शुरू हुआ")\n Thread.sleep(forTimeInterval: Double.random(in: 0.5...2.0))\n print("कार्य \\(i) पूरा हुआ")\n }\n}\n\ngroup.notify(queue: DispatchQueue.main) {\n print("सभी कार्य पूरे हो गए! UI अपडेट करें।")\n}\n\nSwift 5.5+ में आधुनिक async/await
\n\nSwift 5.5 से शुरू करके, Apple ने async और await कीवर्ड पर आधारित एक नया समवर्तीता मॉडल पेश किया। यह अतुल्यकालिक कोड को अधिक पठनीय और समझने योग्य बनाता है।
अतुल्यकालिक फ़ंक्शन परिभाषित करना
\n\nअतुल्यकालिक फ़ंक्शन को async कीवर्ड से चिह्नित किया जाता है, और उनके कॉल के लिए await की आवश्यकता होती है:
import Foundation\n\n// डेटा लोड करने का अतुल्यकालिक फ़ंक्शन\nfunc fetchUserData() async throws -> String {\n let url = URL(string: "https://api.example.com/user")!\n let (data, _) = try await URLSession.shared.data(from: url)\n return String(data: data, encoding: .utf8) ?? "कोई डेटा नहीं"\n}\n\n// async/await का उपयोग\nfunc loadUserProfile() async {\n do {\n let userData = try await fetchUserData()\n await MainActor.run {\n print("उपयोगकर्ता डेटा: \\(userData)")\n }\n } catch {\n print("लोड करने में त्रुटि: \\(error)")\n }\n}\n\n// अतुल्यकालिक कार्य शुरू करना\nTask {\n await loadUserProfile()\n}\n\nAsync let — समानांतर निष्पादन
\n\nasync let कीवर्ड आपको कई अतुल्यकालिक कार्यों को समानांतर रूप से चलाने की अनुमति देता है:
<