Chrome 70 में WebAssembly Threads अब आज़माए जाने के लिए तैयार हैं

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

Alex Danilo

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

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

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

थ्रेड? वर्कर्स के बारे में क्या?

ब्राउज़र, 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() को कॉल करने पर, 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 आर्ट के लिए, एक साथ चल रही चार थ्रेड क्या कर सकती हैं, तो आपको यह डेमो भी देखना चाहिए!

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

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

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