- Rust कम्युनिटी में अक्सर यह सवाल दिखता है: जब threads वह सब कर सकते हैं जो async/await कर सकता है, और ज़्यादा सरल भी लगते हैं, तो async/await क्यों चुना जाए?
- Rust एक low-level भाषा है, इसलिए यह Coroutine की जटिलता को छिपाती नहीं है। यह Go जैसी भाषाओं के उलट है, जहाँ प्रोग्रामर को asynchronous execution के बारे में अलग से सोचे बिना भी चीज़ें डिफ़ॉल्ट रूप से async तरीके से चल सकती हैं।
- समझदार प्रोग्रामर आम तौर पर जटिलता से बचने की कोशिश करते हैं, तो फिर
async/await की ज़रूरत क्यों पड़ती है?
पृष्ठभूमि को समझें
- Rust एक low-level भाषा है। इसका कोड आम तौर पर linear होता है, यानी एक काम पूरा होने के बाद दूसरा काम चलता है।
- लेकिन वेब सर्वर जैसी स्थितियों में, जहाँ एक साथ बहुत सारे काम चलाने पड़ते हैं, linear code समस्या पैदा करता है।
- शुरुआती वेब ने इस समस्या का हल threading लाकर निकालने की कोशिश की थी।
- Threads का उपयोग करके कई clients को एक साथ संभाला जा सकता है, लेकिन प्रोग्रामर concurrency को OS space से user space में लाना चाहते थे।
टाइमआउट की समस्या
- Rust की सबसे बड़ी खूबियों में से एक इसकी composability है।
async/await इस composability को I/O-bound functions पर लागू करने देता है।
- उदाहरण के लिए, अगर किसी client handling function में timeout जोड़ना हो, तो इसे दो combinators के साथ लागू किया जा सकता है।
Thematic threads
- Threads का उपयोग करने वाले उदाहरण में timeout लागू करना आसान नहीं है।
TcpStream में set_read_timeout और set_write_timeout functions होते हैं, लेकिन उनका उपयोग सीमित है।
- लेख Rust के combinators का उपयोग करके timeout को प्रोग्राम करने का तरीका दिखाता है, लेकिन यह
TcpStream तक सीमित है और इसके लिए अतिरिक्त system calls की ज़रूरत पड़ती है।
Async की सफल कहानियाँ
- HTTP ecosystem ने
async/await को मुख्य runtime mechanism के रूप में अपना लिया है।
tower इसका एक अच्छा उदाहरण है, जो async/await की ताकत दिखाता है और timeout, rate limiting, load balancing जैसी सुविधाएँ देता है।
macroquad एक Rust game engine है, जो इंजन चलाने के लिए async/await का उपयोग करता है।
Async की छवि को बेहतर बनाना
async के फ़ायदे उतने व्यापक रूप से जाने नहीं जाते, इसलिए कुछ लोग इसे गलत समझ सकते हैं।
- Rust कम्युनिटी कभी-कभी
async Rust के performance benefits को बढ़ा-चढ़ाकर बताती है और इसके वास्तविक, अर्थपूर्ण फ़ायदों को छोटा करके देखती है।
async/await को ऐसे शक्तिशाली programming model के रूप में देखना चाहिए, जो उन patterns को संक्षिप्त रूप में व्यक्त कर सकता है जिन्हें synchronous Rust में दर्जनों threads और channels के बिना व्यक्त करना मुश्किल होता।
GN⁺ की राय
- concurrency को संभालते समय
async/await कोड की जटिलता बढ़ाता है, लेकिन इसके बदले यह एक साथ बहुत सारे clients को कुशलता से संभालने की क्षमता देता है।
- यह लेख इस बात पर ज़ोर देता है कि
async/await सिर्फ performance benefit तक सीमित नहीं है, बल्कि programming model के रूप में भी मजबूत है।
- Rust का
async/await अलग-अलग I/O tasks के लिए composability देता है, जो खासकर network services और web servers जैसे क्षेत्रों में उपयोगी है।
- आलोचनात्मक नज़र से देखें तो
async/await की जटिलता नए developers के लिए entry barrier बन सकती है, और इसे पार करने के लिए शैक्षिक प्रयासों की ज़रूरत है।
- इसी तरह की functionality देने वाले अन्य projects में Node.js का
async/await implementation और Python की asyncio library शामिल हैं; ये भी समान paradigm प्रदान करते हैं।
async/await अपनाते समय कोड की जटिलता और maintainability पर विचार करना चाहिए, लेकिन जहाँ एक साथ बहुत सारे clients को संभालना हो, वहाँ यह मॉडल बड़ा लाभ देता है।
1 टिप्पणियां
Hacker News राय
Async/await और single-thread
Async/await बनाम threads
लेख के बारे में समस्याएँ
वे पहलू जिन पर बात नहीं हुई
cancellation के बारे में महत्वपूर्ण बिंदु
Async/await के लिए marketing जैसी campaign
Async/await बनाम fibers
Rust के async/await के मुख्य फायदे
Async/await के बारे में गलतफहमियाँ
Async/await बनाम threads चुनने के कारण