Chrome 70 में WebAssembly थ्रेड आज़माने के लिए तैयार हैं

WebAssembly थ्रेड की सुविधा, Chrome 70 में ऑरिजिन ट्रायल के तहत उपलब्ध कराई गई है.

Alex Danilo

WebAssembly (Wasm) की मदद से, C++ और अन्य भाषाओं में लिखे गए कोड को कंपाइल किया जा सकता है, ताकि उसे वेब पर चलाया जा सके. नेटिव ऐप्लिकेशन की एक बहुत ही उपयोगी सुविधा है थ्रेड का उपयोग करने की क्षमता - समानांतर गणना के लिए एक आदिम. ज़्यादातर C और C++ डेवलपर, pthreads के बारे में जानते होंगे. यह किसी ऐप्लिकेशन में थ्रेड मैनेज करने के लिए, स्टैंडर्ड एपीआई है.

WebAssembly कम्यूनिटी ग्रुप, वेब पर थ्रेड लाने के लिए काम कर रहा है, ताकि मल्टी-थ्रेडेड ऐप्लिकेशन बनाए जा सकें. इस कोशिश के तहत, V8 ने WebAssembly इंजन में थ्रेड के लिए ज़रूरी सहायता लागू की है. यह ऑरिजिन ट्रायल के ज़रिए उपलब्ध है. ऑरिजिन ट्रायल की मदद से, डेवलपर वेब की नई सुविधाओं को पूरी तरह से स्टैंडर्ड बनाए जाने से पहले, उन्हें एक्सपेरिमेंट के तौर पर इस्तेमाल कर सकते हैं. इससे हमें डेवलपर से असल दुनिया के फ़ीडबैक इकट्ठा करने में मदद मिलती है. यह नई सुविधाओं की पुष्टि करने और उन्हें बेहतर बनाने के लिए ज़रूरी है.

Chrome 70 के रिलीज़ में, WebAssembly के लिए थ्रेड की सुविधा काम करती है. हम चाहते हैं कि डेवलपर इसका इस्तेमाल करें और हमें सुझाव/राय दें या शिकायत करें.

Threads? कर्मचारियों के लिए क्या नीति है?

ब्राउज़र, 2012 से Chrome 4 में वेब वर्कर के ज़रिए पैरललिज़्म की सुविधा देते हैं. असल में, 'मुख्य थ्रेड पर' वगैरह जैसे शब्द सुनना आम बात है. हालांकि, वेब वर्कर अपने बीच म्यूटेबल डेटा शेयर नहीं करते. इसके बजाय, वे कम्यूनिकेशन के लिए मैसेज-पासिंग पर भरोसा करते हैं. Chrome, हर टैब के लिए एक नया V8 इंजन असाइन करता है. इन्हें आइसोलेट कहा जाता है. आइसोलेट, न तो कंपाइल किया गया कोड शेयर करते हैं और न ही JavaScript ऑब्जेक्ट. इसलिए, वे pthreads जैसे म्यूटेबल डेटा को शेयर नहीं कर सकते.

दूसरी ओर, WebAssembly थ्रेड ऐसे थ्रेड होते हैं जो एक ही Wasm मेमोरी को शेयर कर सकते हैं. शेयर की गई मेमोरी का स्टोरेज, SharedArrayBuffer की मदद से पूरा किया जाता है. यह एक JavaScript प्रिमिटिव है, जो एक ही ArrayBuffer के कॉन्टेंट को एक साथ कई वर्कर के बीच शेयर करने की अनुमति देता है. हर WebAssembly थ्रेड, वेब वर्कर में चलता है. हालांकि, शेयर की गई Wasm मेमोरी की वजह से, वे नेटिव प्लैटफ़ॉर्म की तरह ही काम कर पाते हैं. इसका मतलब है कि Wasm थ्रेड का इस्तेमाल करने वाले ऐप्लिकेशन, शेयर की गई मेमोरी के ऐक्सेस को मैनेज करने के लिए ज़िम्मेदार होते हैं. ठीक वैसे ही जैसे किसी भी ट्रेडिशनल थ्रेड वाले ऐप्लिकेशन में होता है. C या C++ में लिखी गई कई मौजूदा कोड लाइब्रेरी हैं, जो pthreads का इस्तेमाल करती हैं. इन्हें Wasm में कंपाइल किया जा सकता है और ट्रू थ्रेडेड मोड में चलाया जा सकता है. इससे एक ही डेटा पर, एक साथ कई कोर काम कर सकते हैं.

एक आसान उदाहरण

यहां थ्रेड का इस्तेमाल करने वाले एक सामान्य 'C' प्रोग्राम का उदाहरण दिया गया है.

#include <pthread.h>
#include <stdio.h>

// Calculate Fibonacci numbers shared function
int fibonacci(int iterations) {
    int     val = 1;
    int     last = 0;

    if (iterations == 0) {
        return 0;
    }
    for (int i = 1; i < iterations; i++) {
        int     seq;

        seq = val + last;
        last = val;
        val = seq;
    }
    return val;
}
// Start function for the background thread
void *bg_func(void *arg) {
    int     *iter = (void *)arg;

    *iter = fibonacci(*iter);
    return arg;
}
// Foreground thread and main entry point
int main(int argc, char *argv[]) {
    int         fg_val = 54;
    int         bg_val = 42;
    pthread_t   bg_thread;

    // Create the background thread
    if (pthread_create(&bg_thread, NULL, bg_func, &bg_val)) {
        perror("Thread create failed");
        return 1;
    }
    // Calculate on the foreground thread
    fg_val = fibonacci(fg_val);
    // Wait for background thread to finish
    if (pthread_join(bg_thread, NULL)) {
        perror("Thread join failed");
        return 2;
    }
    // Show the result from background and foreground threads
    printf("Fib(42) is %d, Fib(6 * 9) is %d\n", bg_val, fg_val);

    return 0;
}

यह कोड main() फ़ंक्शन से शुरू होता है. यह फ़ंक्शन, दो वैरिएबल fg_val और bg_val का एलान करता है. इसमें fibonacci() नाम का एक फ़ंक्शन भी है. इस उदाहरण में, दोनों थ्रेड इसे कॉल करेंगे. main() फ़ंक्शन, pthread_create() का इस्तेमाल करके एक बैकग्राउंड थ्रेड बनाता है. इसका काम, bg_val वैरिएबल की वैल्यू के हिसाब से, फ़िबोनाची नंबर सीक्वेंस की वैल्यू का हिसाब लगाना है. इस बीच, फ़ोरग्राउंड थ्रेड में चल रहा main() फ़ंक्शन, fg_val वैरिएबल के लिए इसकी गणना करता है. बैकग्राउंड थ्रेड के चलने के बाद, नतीजे प्रिंट हो जाते हैं.

थ्रेड की सुविधा के लिए कंपाइल करना

सबसे पहले, आपके पास emscripten SDK इंस्टॉल होना चाहिए. इसके लिए, 1.38.11 या इसके बाद का वर्शन इस्तेमाल करें. ब्राउज़र में चलाने के लिए, थ्रेड चालू करके हमारे उदाहरण कोड को बनाने के लिए, हमें emscripten emcc कंपाइलर को कुछ अतिरिक्त फ़्लैग पास करने होंगे. हमारी कमांड लाइन कुछ इस तरह दिखती है:

emcc -O2 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -o test.js test.c

कमांड लाइन आर्ग्युमेंट '-s USE_PTHREADS=1', कंपाइल किए गए WebAssembly मॉड्यूल के लिए थ्रेडिंग की सुविधा चालू करता है. साथ ही, आर्ग्युमेंट '-s PTHREAD_POOL_SIZE=2' कंपाइलर को दो (2) थ्रेड का पूल जनरेट करने के लिए कहता है.

प्रोग्राम चलाने पर, यह WebAssembly मॉड्यूल को लोड करेगा. साथ ही, थ्रेड पूल में मौजूद हर थ्रेड के लिए एक वेब वर्कर बनाएगा और हर वर्कर के साथ मॉड्यूल को शेयर करेगा. इस मामले में, यह दो है. इनका इस्तेमाल तब किया जाएगा, जब pthread_create() को कॉल किया जाएगा. हर वर्कर, एक ही मेमोरी के साथ Wasm मॉड्यूल को इंस्टैंशिएट करता है. इससे उन्हें साथ मिलकर काम करने में मदद मिलती है. V8 के 7.0 वर्शन में किए गए नए बदलावों के तहत, Wasm मॉड्यूल के कंपाइल किए गए नेटिव कोड को शेयर किया जाता है. यह कोड, वर्कर के बीच पास किया जाता है. इससे बहुत बड़े ऐप्लिकेशन भी कई वर्कर के साथ काम कर सकते हैं. ध्यान दें, यह पक्का करना ज़रूरी है कि थ्रेड पूल का साइज़, आपके ऐप्लिकेशन के लिए ज़रूरी थ्रेड की ज़्यादा से ज़्यादा संख्या के बराबर हो. ऐसा न होने पर, थ्रेड बनाने में समस्या आ सकती है. वहीं, अगर थ्रेड पूल का साइज़ बहुत बड़ा है, तो ऐसे वेब वर्कर बन जाएंगे जिनकी ज़रूरत नहीं है. ये वेब वर्कर कुछ नहीं करेंगे, लेकिन मेमोरी का इस्तेमाल करेंगे.

इसे आज़माने का तरीका

हमारे WebAssembly मॉड्यूल को टेस्ट करने का सबसे तेज़ तरीका है, Chrome 70 और इसके बाद के वर्शन में, एक्सपेरिमेंट के तौर पर उपलब्ध WebAssembly थ्रेड की सुविधा को चालू करना. अपने ब्राउज़र में, यूआरएल about://flags पर जाएं, जैसा कि यहां दिखाया गया है:

Chrome फ़्लैग पेज

इसके बाद, WebAssembly थ्रेड की एक्सपेरिमेंटल सेटिंग ढूंढें, जो इस तरह दिखती है:

WebAssembly थ्रेड की सेटिंग

सेटिंग को चालू है पर सेट करें, जैसा कि यहां दिखाया गया है. इसके बाद, अपना ब्राउज़र रीस्टार्ट करें.

WebAssembly थ्रेड की सेटिंग चालू है

ब्राउज़र के रीस्टार्ट होने के बाद, हम थ्रेडेड WebAssembly मॉड्यूल को कम से कम एचटीएमएल पेज के साथ लोड करने की कोशिश कर सकते हैं. इसमें सिर्फ़ यह कॉन्टेंट शामिल है:

<!DOCTYPE html>
<html>
  <title>Threads test</title>
  <body>
    <script src="test.js"></script>
  </body>
</html>

इस पेज को आज़माने के लिए, आपको किसी वेब सर्वर को चलाना होगा और उसे अपने ब्राउज़र से लोड करना होगा. इससे WebAssembly मॉड्यूल लोड और रन होगा. DevTools खोलने पर, हमें रन का आउटपुट दिखता है. आपको कंसोल में, नीचे दी गई आउटपुट इमेज जैसा कुछ दिखना चाहिए:

फ़िबोनाची प्रोग्राम से कंसोल आउटपुट

थ्रेड वाला हमारा WebAssembly प्रोग्राम, सही तरीके से लागू हो गया है! हमारा सुझाव है कि आप ऊपर बताए गए तरीके का इस्तेमाल करके, अपना थ्रेडेड ऐप्लिकेशन आज़माएं.

ऑरिजिन ट्रायल की मदद से, फ़ील्ड में जांच करना

डेवलपमेंट के मकसद से, ब्राउज़र में एक्सपेरिमेंट के तौर पर उपलब्ध फ़्लैग चालू करके थ्रेड को आज़माना ठीक है. हालांकि, अगर आपको अपने ऐप्लिकेशन को फ़ील्ड में टेस्ट करना है, तो ऑरिजिन ट्रायल का इस्तेमाल करें.

ऑरिजिन ट्रायल की मदद से, उपयोगकर्ताओं के साथ एक्सपेरिमेंट के तौर पर उपलब्ध सुविधाओं को आज़माया जा सकता है. इसके लिए, आपको टेस्टिंग टोकन लेना होगा. यह टोकन आपके डोमेन से जुड़ा होता है. इसके बाद, अपने ऐप्लिकेशन को डिप्लॉय किया जा सकता है. साथ ही, यह उम्मीद की जा सकती है कि वह किसी ऐसे ब्राउज़र में काम करेगा जो आपकी जांच की जा रही सुविधा के साथ काम करता हो. इस मामले में, Chrome 70 और इसके बाद के वर्शन में. ऑरिजिन ट्रायल चलाने के लिए, अपना टोकन पाने के लिए, यहां दिए गए ऐप्लिकेशन फ़ॉर्म का इस्तेमाल करें.

हमने ऊपर दिए गए आसान उदाहरण को ऑरिजिन ट्रायल टोकन का इस्तेमाल करके होस्ट किया है. इससे आपको कुछ भी बनाए बिना, इसे खुद आज़माने का मौका मिलता है.

अगर आपको देखना है कि एक साथ चलने वाले चार थ्रेड, ASCII आर्ट के लिए क्या कर सकते हैं, तो आपको यह डेमो भी देखना चाहिए!

हमें प्रतिक्रिया दें

WebAssembly थ्रेड, ऐप्लिकेशन को वेब पर पोर्ट करने के लिए एक बेहद काम का नया प्रिमिटिव है. अब WebAssembly एनवायरमेंट में, C और C++ ऐप्लिकेशन और लाइब्रेरी को चलाया जा सकता है. इसके लिए, pthreads की ज़रूरत होती है.

हम इस सुविधा को आज़माने वाले डेवलपर से सुझाव, राय या शिकायत पाना चाहते हैं. इससे हमें स्टैंडर्ड तय करने की प्रोसेस को बेहतर बनाने और इस सुविधा की उपयोगिता की पुष्टि करने में मदद मिलेगी. सुझाव/राय देने या शिकायत करने का सबसे अच्छा तरीका है, समस्याओं की शिकायत करना और/या WebAssembly कम्यूनिटी ग्रुप में स्टैंडर्डाइज़ेशन की प्रोसेस में शामिल होना.