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 ऑब्जेक्ट को शेयर नहीं करते. इसलिए, वे PThread जैसे बदले जा सकने वाले डेटा को शेयर नहीं कर सकते.

दूसरी ओर, 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 कम्यूनिटी ग्रुप में, स्टैंडर्डाइज़ेशन प्रोसेस में शामिल हों.