WebAssembly থ্রেডগুলি Chrome 70-এ চেষ্টা করার জন্য প্রস্তুত৷

WebAssembly থ্রেড সমর্থন একটি অরিজিন-ট্রায়ালের অধীনে Chrome 70 এ পাঠানো হয়েছে।

Alex Danilo

WebAssembly (Wasm) ওয়েবে চালানোর জন্য C++ এবং অন্যান্য ভাষায় লেখা কোডের সংকলন সক্ষম করে। নেটিভ অ্যাপ্লিকেশনগুলির একটি খুব দরকারী বৈশিষ্ট্য হল থ্রেড ব্যবহার করার ক্ষমতা - সমান্তরাল গণনার জন্য একটি আদিম। বেশিরভাগ C এবং C++ বিকাশকারীরা pthreads এর সাথে পরিচিত হবেন যা একটি অ্যাপ্লিকেশনে থ্রেড পরিচালনার জন্য একটি প্রমিত API।

WebAssembly কমিউনিটি গ্রুপ বাস্তব মাল্টি-থ্রেডেড অ্যাপ্লিকেশন সক্ষম করতে ওয়েবে থ্রেড আনার জন্য কাজ করছে। এই প্রচেষ্টার অংশ হিসেবে, V8 WebAssembly ইঞ্জিনে থ্রেডের জন্য প্রয়োজনীয় সমর্থন বাস্তবায়ন করেছে, যা একটি অরিজিন ট্রায়ালের মাধ্যমে উপলব্ধ। অরিজিন ট্রায়ালগুলি ডেভেলপারদের সম্পূর্ণরূপে প্রমিত হওয়ার আগে নতুন ওয়েব বৈশিষ্ট্যগুলি নিয়ে পরীক্ষা করার অনুমতি দেয়৷ এটি আমাদের নির্ভীক বিকাশকারীদের কাছ থেকে বাস্তব-বিশ্বের প্রতিক্রিয়া সংগ্রহ করতে দেয়, যা নতুন বৈশিষ্ট্যগুলিকে যাচাই এবং উন্নত করার জন্য গুরুত্বপূর্ণ।

Chrome 70 রিলিজ WebAssembly-এর জন্য থ্রেড সমর্থন করে এবং আমরা আগ্রহী বিকাশকারীদের সেগুলি ব্যবহার শুরু করতে এবং আমাদের প্রতিক্রিয়া জানাতে উত্সাহিত করি৷

থ্রেড? শ্রমিকদের কি হবে?

ব্রাউজারগুলি ক্রোম 4-এ 2012 সাল থেকে ওয়েব ওয়ার্কার্সের মাধ্যমে সমান্তরালতা সমর্থন করেছে; প্রকৃতপক্ষে 'প্রধান থ্রেডে' ইত্যাদি শব্দগুলি শোনা স্বাভাবিক। তবে, ওয়েব ওয়ার্কাররা তাদের মধ্যে পরিবর্তনযোগ্য ডেটা ভাগ করে না, পরিবর্তে যোগাযোগের জন্য বার্তা প্রেরণের উপর নির্ভর করে। আসলে, ক্রোম তাদের প্রত্যেকের জন্য একটি নতুন V8 ইঞ্জিন বরাদ্দ করে (যাকে আইসোলেট বলা হয়)। আইসোলেটগুলি কম্পাইল করা কোড বা জাভাস্ক্রিপ্ট অবজেক্টগুলি ভাগ করে না এবং এইভাবে তারা pthreads এর মতো পরিবর্তনযোগ্য ডেটা ভাগ করতে পারে না।

WebAssembly থ্রেড, অন্যদিকে, থ্রেড যা একই Wasm মেমরি শেয়ার করতে পারে। ভাগ করা মেমরির অন্তর্নিহিত সঞ্চয়স্থান একটি SharedArrayBuffer দিয়ে সম্পন্ন করা হয়, একটি জাভাস্ক্রিপ্ট আদিম যা কর্মীদের মধ্যে একযোগে একক 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() ফাংশন দিয়ে শুরু হয় যা 2টি ভেরিয়েবল fg_val এবং bg_val ঘোষণা করে। এছাড়াও fibonacci() নামে একটি ফাংশন রয়েছে, যা এই উদাহরণে উভয় থ্রেড দ্বারা ডাকা হবে। main() ফাংশন pthread_create() ব্যবহার করে একটি ব্যাকগ্রাউন্ড থ্রেড তৈরি করে যার কাজ হল bg_val ভেরিয়েবলের মানের সাথে সম্পর্কিত ফিবোনাচি নম্বর সিকোয়েন্স মান গণনা করা। এদিকে, ফোরগ্রাউন্ড থ্রেডে চলমান main() ফাংশন এটি fg_val ভেরিয়েবলের জন্য গণনা করে। ব্যাকগ্রাউন্ড থ্রেড চলা শেষ হয়ে গেলে, ফলাফল প্রিন্ট করা হয়।

থ্রেড সমর্থন জন্য কম্পাইল

প্রথমে, আপনার এমস্ক্রিপ্টেন 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() এ কল করা হয়। প্রতিটি কর্মী একই মেমরির সাথে ওয়াসম মডিউলটি ইনস্ট্যান্টিয়েট করে, তাদের সহযোগিতা করার অনুমতি দেয়। 7.0-এ V8-এর নতুন পরিবর্তনগুলি ওয়াসম মডিউলগুলির সংকলিত নেটিভ কোড শেয়ার করে যা কর্মীদের মধ্যে পাস করা হয়, যা এমনকি খুব বড় অ্যাপ্লিকেশনগুলিকে অনেক শ্রমিকের কাছে স্কেল করতে দেয়। দ্রষ্টব্য, থ্রেড পুলের আকার আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় সর্বাধিক সংখ্যক থ্রেডের সমান তা নিশ্চিত করা বোধগম্য, বা থ্রেড তৈরি ব্যর্থ হতে পারে। একই সময়ে, যদি থ্রেড পুলের আকার খুব বড় হয়, তাহলে আপনি অপ্রয়োজনীয় ওয়েব ওয়ার্কার তৈরি করবেন যেগুলি মেমরি ব্যবহার করা ছাড়া আর কিছুই করবে না।

কিভাবে এটা চেষ্টা করে দেখুন

আমাদের WebAssembly মডিউল পরীক্ষা করার দ্রুততম উপায় হল Chrome 70 এর পরের পরীক্ষামূলক WebAssembly থ্রেড সমর্থন চালু করা। নীচে দেখানো হিসাবে আপনার ব্রাউজারে about://flags URL এ নেভিগেট করুন:

Chrome পতাকা পৃষ্ঠা

এরপরে, পরীক্ষামূলক WebAssembly থ্রেড সেটিং খুঁজুন যা দেখতে এইরকম:

WebAssembly থ্রেড সেটিং

নিচে দেখানো মত সেটিংটি Enabled এ পরিবর্তন করুন, তারপর আপনার ব্রাউজার রিস্টার্ট করুন।

WebAssembly থ্রেড সেটিং সক্ষম

ব্রাউজারটি পুনরায় চালু হওয়ার পরে, আমরা একটি ন্যূনতম HTML পৃষ্ঠা সহ থ্রেডেড WebAssembly মডিউলটি লোড করার চেষ্টা করতে পারি, যেখানে শুধুমাত্র এই বিষয়বস্তু রয়েছে:

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

এই পৃষ্ঠাটি চেষ্টা করার জন্য, আপনাকে ওয়েব সার্ভারের কিছু ফর্ম চালাতে হবে এবং এটি আপনার ব্রাউজার থেকে লোড করতে হবে৷ এটি WebAssembly মডিউল লোড এবং চালানোর কারণ হবে। DevTools ওপেন করা আমাদের রান থেকে আউটপুট দেখায় এবং আপনি কনসোলে নীচের আউটপুট চিত্রের মতো কিছু দেখতে পাবেন:

ফিবোনাচি প্রোগ্রাম থেকে কনসোল আউটপুট

থ্রেড সহ আমাদের WebAssembly প্রোগ্রাম সফলভাবে সম্পাদিত হয়েছে! আমরা আপনাকে উপরে বর্ণিত ধাপগুলি ব্যবহার করে আপনার নিজস্ব থ্রেডেড অ্যাপ্লিকেশন চেষ্টা করার জন্য উত্সাহিত করব।

একটি অরিজিন ট্রায়াল সঙ্গে ক্ষেত্রে পরীক্ষা

ব্রাউজারে পরীক্ষামূলক ফ্ল্যাগগুলি চালু করে থ্রেডগুলি চেষ্টা করা উন্নয়নের উদ্দেশ্যে ঠিক আছে, তবে আপনি যদি আপনার অ্যাপ্লিকেশনটি ক্ষেত্রে পরীক্ষা করতে চান, তাহলে আপনি এটি করতে পারেন যা একটি অরিজিন ট্রায়াল হিসাবে পরিচিত৷

অরিজিন ট্রায়ালগুলি আপনাকে আপনার ডোমেনের সাথে সংযুক্ত একটি টেস্টিং টোকেন পাওয়ার মাধ্যমে আপনার ব্যবহারকারীদের সাথে পরীক্ষামূলক বৈশিষ্ট্যগুলি ব্যবহার করে দেখতে দেয়৷ তারপরে আপনি আপনার অ্যাপটি স্থাপন করতে পারেন এবং এটি এমন একটি ব্রাউজারে কাজ করার আশা করতে পারেন যা আপনার পরীক্ষা করা বৈশিষ্ট্যটিকে সমর্থন করতে পারে (এই ক্ষেত্রে Chrome 70 এর পরে)। একটি অরিজিন ট্রায়াল চালানোর জন্য আপনার নিজস্ব টোকেন পেতে, এখানে আবেদন ফর্মটি ব্যবহার করুন।

আমরা উপরে একটি অরিজিন ট্রায়াল টোকেন ব্যবহার করে আমাদের সহজ উদাহরণটি হোস্ট করেছি, তাই আপনি কিছু তৈরি করার প্রয়োজন ছাড়াই এটি নিজের জন্য চেষ্টা করতে পারেন।

আপনি যদি দেখতে চান যে 4টি থ্রেড সমান্তরালভাবে ASCII শিল্পের জন্য কী করতে পারে, তাহলে আপনাকে অবশ্যই এই ডেমোটিও দেখতে হবে!

আমাদের মতামত দিন

ওয়েব অ্যাসেম্বলি থ্রেডগুলি ওয়েবে অ্যাপ্লিকেশন পোর্ট করার জন্য একটি অত্যন্ত দরকারী নতুন আদিম। এখন C এবং C++ অ্যাপ্লিকেশন এবং লাইব্রেরি চালানো সম্ভব যার জন্য WebAssembly পরিবেশে pthreads সমর্থন প্রয়োজন।

আমরা এই বৈশিষ্ট্যটি ব্যবহার করে ডেভেলপারদের কাছ থেকে প্রতিক্রিয়া খুঁজছি কারণ এটি মানককরণ প্রক্রিয়া সম্পর্কে অবহিত করার পাশাপাশি এর উপযোগিতা যাচাই করতে সহায়তা করবে। প্রতিক্রিয়া পাঠানোর সর্বোত্তম উপায় হল সমস্যাগুলি রিপোর্ট করা এবং/অথবা WebAssembly কমিউনিটি গ্রুপে প্রমিতকরণ প্রক্রিয়ার সাথে জড়িত হওয়া।