Rust में, एसिंक्रोनस प्रोग्रामिंग, फ़्यूचर के कॉन्सेप्ट पर निर्भर करती है. इससे, लंबे समय तक चलने वाले ऐसे ऑपरेशन दिखाए जा सकते हैं जो तुरंत पूरे नहीं हो सकते. इन फ़्यूचर को पूरा करने और इन्हें चलाने के लिए, एक मैकेनिज़्म की ज़रूरत होती है. यहां एसिंक्रोनस एक्ज़ीक्यूटर काम आते हैं.
एसिंक्रोनस एक्ज़ीक्यूटर, इन फ़्यूचर को मैनेज करने और चलाने के लिए ज़िम्मेदार होता है. यह एक ऐसा एनवायरमेंट उपलब्ध कराता है जहां फ़्यूचर को शेड्यूल किया जा सकता है, उनकी प्रोग्रेस को पोल किया जा सकता है, और आखिर में उन्हें पूरा किया जा सकता है. इसे एक ऑर्केस्ट्रेटर के तौर पर समझें, जो एसिंक्रोनस टास्क की मुश्किलों को हैंडल करता है. इससे आपका कोड, रिस्पॉन्सिव और बेहतर तरीके से काम करता है.
Rust में अलग-अलग एसिंक्रोनस एक्ज़ीक्यूटर उपलब्ध हैं. हर एक्ज़ीक्यूटर की अपनी खासियतें और विशेषताएं होती हैं.
एसिंक्रोनस एक्ज़ीक्यूटर
Rust सेवा के लिए एक्ज़ीक्यूटर का चुनाव, उसके वर्कलोड पर निर्भर करता है. Tokio एक बेहतरीन एसिंक्रोनस रनटाइम है. हालांकि, यह सभी स्थितियों के लिए सबसे सही समाधान नहीं हो सकता.
ऐसी सेवाओं के लिए जो मुख्य तौर पर सीक्वेंशियल ऑपरेशन करती हैं, Tokio जैसे एसिंक्रोनस रनटाइम को लागू करने से, परफ़ॉर्मेंस में कोई खास सुधार नहीं होता. साथ ही, इससे ज़रूरत से ज़्यादा ओवरहेड भी हो सकता है. ऐसे मामलों में, सिंगल-थ्रेडेड एक्ज़ीक्यूटर, ज़्यादा सही और हल्का विकल्प हो सकता है. इस तरीके से, कोडबेस आसान हो जाता है और संसाधनों की खपत कम हो जाती है.
वर्कर थ्रेड कॉन्फ़िगर करना
ऐसी सेवाओं के लिए जो स्वाभाविक तौर पर कंकरंट या एसिंक्रोनस ऑपरेशन करती हैं, Tokio जैसे एसिंक्रोनस रनटाइम की क्षमताओं का इस्तेमाल करना ज़रूरी है. इन स्थितियों में परफ़ॉर्मेंस को बेहतर बनाने के लिए, रनटाइम को वर्कर थ्रेड की संख्या के हिसाब से कॉन्फ़िगर करें. यह संख्या, सिस्टम पर उपलब्ध सीपीयू कोर की संख्या के बराबर होनी चाहिए. इससे रनटाइम, वर्कलोड को बेहतर तरीके से डिस्ट्रिब्यूट कर पाता है और उपलब्ध प्रोसेसिंग पावर का पूरा फ़ायदा ले पाता है.
वर्कर थ्रेड को कॉन्फ़िगर करते समय, पूरे सिस्टम एनवायरमेंट पर ध्यान दें. अगर एक ही वर्चुअल मशीन पर एक से ज़्यादा सेवाएं चल रही हैं, तो हर सेवा के लिए वर्कर थ्रेड की संख्या को अडजस्ट करें. इससे सीपीयू का ज़रूरत से ज़्यादा इस्तेमाल नहीं होगा और सभी ऐक्टिव प्रोसेस के बीच संसाधनों का सही तरीके से बंटवारा होगा.
ब्लॉक करने वाले ऑपरेशन
यह पक्का करना ज़रूरी है कि एसिंक्रोनस रनटाइम में वर्कर थ्रेड, लंबे समय तक चलने वाले या सिंक्रोनस ऑपरेशन की वजह से कभी ब्लॉक न हों. वर्कर थ्रेड को ब्लॉक करने से, रनटाइम की आने वाले टास्क को प्रोसेस करने और रिस्पॉन्सिव बने रहने की क्षमता पर बुरा असर पड़ सकता है.
अगर किसी वर्कर थ्रेड पर चलने वाले फ़ंक्शन को ब्लॉक करने वाला ऑपरेशन करना है, तो tokio::spawn_blocking का इस्तेमाल करें. यह फ़ंक्शन, ब्लॉक करने वाले ऑपरेशन को एक अलग थ्रेड पूल पर ऑफ़लोड करता है. यह थ्रेड पूल, खास तौर पर ऐसे टास्क के लिए डिज़ाइन किया गया है. इससे एसिंक्रोनस वर्कर थ्रेड में कोई रुकावट नहीं आती और सेवा की पूरी रिस्पॉन्सिवनेस बनी रहती है.