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

Chrome 70 में WebAssembly थ्रेड से जुड़ी सहायता को भेजने की सुविधा, ऑरिजिन-ट्रायल के तहत दी गई है.

Alex Danilo

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

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

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

थ्रेड? कर्मचारियों का क्या होगा?

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

दूसरी ओर, WebAssembly थ्रेड, ऐसे थ्रेड होते हैं जिनमें एक ही Wasm मेमोरी हो सकती है. शेयर की गई मेमोरी का स्टोरेज SharedArrayBuffer की मदद से पूरा किया जाता है. यह एक JavaScript प्रिमिटिव होता है, जो ArrayBuffer के कॉन्टेंट को एक ही समय पर शेयर करने की अनुमति देता है. हर WebAssembly थ्रेड एक वेब वर्कर में चलता है. लेकिन उनकी शेयर की गई Wasm मेमोरी, उन्हें बहुत हद तक नेटिव प्लैटफ़ॉर्म पर काम करने देती है. इसका मतलब है कि Wasm थ्रेड का इस्तेमाल करने वाले ऐप्लिकेशन, शेयर की गई मेमोरी के ऐक्सेस को मैनेज करने के लिए ज़िम्मेदार होते हैं, जैसा कि किसी भी परंपरागत थ्रेड वाले ऐप्लिकेशन में होता है. C या C++ में कई ऐसी कोड लाइब्रेरी मौजूद हैं जो pthread का इस्तेमाल करती हैं. साथ ही, उन्हें 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 मॉड्यूल लोड करेगा और थ्रेड पूल के हर थ्रेड के लिए एक वेब वर्कर बनाएगा. हर वर्कर के साथ मॉड्यूल शेयर करेगा. इस मामले में यह 2 है, और जब भी 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 मॉड्यूल लोड होकर काम करेगा. DevTool खोलने पर हमें, रन करने के बाद का आउटपुट दिखता है. आपको कंसोल में, नीचे दी गई आउटपुट इमेज जैसा कुछ दिखेगा:

Fibonacci प्रोग्राम से कंसोल आउटपुट

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

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

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

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

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

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

अपने सुझाव दें

WebAssembly थ्रेड, ऐप्लिकेशन को वेब पर पोर्ट करने के लिए बहुत ही उपयोगी नए शुरुआती दौर हैं. अब ऐसे C और C++ ऐप्लिकेशन और लाइब्रेरी चलाई जा सकती है जिनके लिए WebAssembly एनवायरमेंट में pthread की मदद चाहिए.

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