4 पॉइंट द्वारा GN⁺ 2024-03-26 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 टिप्पणियां

 
GN⁺ 2024-03-26
Hacker News राय
  • Async/await और single-thread

    • JavaScript मॉडल की तरह single-thread में async/await सरल है और अच्छी तरह समझा जाता है.
    • threads का उपयोग करने पर कई CPU समस्या को संभाल सकते हैं, और Rust lock management में मदद करता है.
    • अलग-अलग priority वाले threads रखे जा सकते हैं, और computation पर सीमाएँ होने की स्थिति में इसकी ज़रूरत पड़ती है.
    • multi-thread async/await जटिल है. computation-सीमित sections में यह मॉडल टूट सकता है.
    • Rust में multi-thread computation अच्छी तरह काम नहीं करती. समस्याएँ इनमें शामिल हैं:
      • Futex congestion collapse: कुछ storage allocators में यह समस्या हो सकती है.
      • unfair mutex starvation: standard Mutex और crossbeam-channel channel निष्पक्ष नहीं हैं.
  • Async/await बनाम threads

    • आलोचना complexity के बारे में नहीं है, बल्कि इस बारे में है कि चुनाव के कारण ecosystem बँट जाता है और एक विकल्प हीन हो जाता है.
    • Rust ecosystem ने तय कर लिया है कि I/O काम करने के लिए सबको async/await का ही उपयोग करना होगा.
    • अगर Rust ने async/await के अलावा बाकी चीज़ों को भी अधिक composable abstractions बनाया होता, तो असंतोष खत्म हो गया होता.
  • लेख के बारे में समस्याएँ

    • सिर्फ एक web server उदाहरण दिया गया, और threads के बारे में उसे गलत ढंग से हल किया गया.
    • programmers OS threads नहीं, बल्कि conceptual और semantic threads चाहते हैं.
    • OS threads महंगे होते हैं, और हमें सस्ते threads चाहिए.
    • web server उदाहरण में timeout implementation की समस्या है.
  • वे पहलू जिन पर बात नहीं हुई

    • async/await single-thread पर चलता है, इसलिए locks या synchronization की ज़रूरत नहीं होती.
    • async/await में error propagation स्पष्ट नहीं है.
    • network I/O में backpressure का भी ज़िक्र होना चाहिए.
  • cancellation के बारे में महत्वपूर्ण बिंदु

    • future में किसी भी task को आसानी से cancel किया जा सकता है.
    • threads में cancellation जटिल है, और threads को जबरन रोकना भरोसेमंद नहीं है.
    • Rust के async मॉडल में सभी futures पर बाहर से timeout जोड़ा जा सकता है.
  • Async/await के लिए marketing जैसी campaign

    • async/await एक तकनीकी गलती थी, और इसने community पर भारी लागत डाली.
    • Rust अब भी सबसे अच्छी भाषा है, लेकिन चिंता है कि यह बहस हमेशा चलती रहेगी.
  • Async/await बनाम fibers

    • Rust में पहले green threads थे और उन्हें जानबूझकर हटा दिया गया.
    • futures को किसी भी समय drop कर पाने की क्षमता की बड़ी कीमत चुकानी पड़ती है.
    • async/await की composability की तारीफ़ करना अजीब लगता है.
  • Rust के async/await के मुख्य फायदे

    • यह threads या dynamic memory के बिना भी काम कर सकता है.
    • concurrency का उपयोग करके code को संक्षिप्त लिखा जा सकता है.
  • Async/await के बारे में गलतफहमियाँ

    • कुछ लोग यह नहीं समझते कि single-thread में concurrency mechanism की ज़रूरत क्यों होती है.
    • UI programming, GPU के साथ communication, और runtimes के बीच communication में async/await उपयोगी है.
  • Async/await बनाम threads चुनने के कारण

    • async/await client/request/task state की memory usage को कम कर सकता है.
    • state compression आज के धीमी memory वाले आधुनिक सिस्टम में performance के लिए महत्वपूर्ण है.
    • async/await और CPS प्रति client memory usage घटाने में प्रभावी हैं.