WebAssembly Threads พร้อมให้ลองใช้ใน Chrome 70 แล้ว

มีการจัดส่งการสนับสนุนเทรด WebAssembly ใน Chrome 70 ภายใต้ช่วงทดลองใช้จากต้นทาง

Alex Danilo

WebAssembly (Wasm) ช่วยให้การรวบรวมโค้ดที่เขียนด้วย C++ และภาษาอื่นๆ ทำงานบนเว็บได้ ฟีเจอร์ที่มีประโยชน์มากอย่างหนึ่งของแอปพลิเคชันที่มาพร้อมเครื่องคือ ความสามารถในการใช้ชุดข้อความ ซึ่งเป็นพื้นฐานของการคำนวณแบบคู่ขนาน นักพัฒนาซอฟต์แวร์ C และ C++ ส่วนใหญ่จะคุ้นเคยกับ pthreads ซึ่งเป็น API มาตรฐานสำหรับการจัดการเทรดในแอปพลิเคชัน

WebAssembly Community Group ได้พยายามนำชุดข้อความไปยังเว็บเพื่อเปิดใช้งานแอปพลิเคชันแบบมัลติเทรดจริง ในความพยายามนี้ V8 ได้นำการสนับสนุนที่จำเป็นสำหรับชุดข้อความในเครื่องมือ WebAssembly ซึ่งพร้อมใช้งานผ่านช่วงทดลองใช้จากต้นทาง ช่วงทดลองใช้จากต้นทางช่วยให้นักพัฒนาซอฟต์แวร์ได้ทดสอบฟีเจอร์บนเว็บใหม่ๆ ก่อนที่จะได้มาตรฐานโดยสมบูรณ์ วิธีนี้ช่วยให้เรารวบรวมความคิดเห็นจากนักพัฒนาซอฟต์แวร์ที่จริงจังกับการใช้งานจริงได้ ซึ่งเป็นสิ่งจำเป็นในการตรวจสอบและปรับปรุงฟีเจอร์ใหม่ๆ

Chrome 70 รุ่นนี้รองรับชุดข้อความสำหรับ WebAssembly และเราขอแนะนำให้นักพัฒนาแอปที่สนใจเริ่มใช้ชุดข้อความนี้และแสดงความคิดเห็นกับเรา

ชุดข้อความ แล้วผู้ปฏิบัติงานล่ะ

เบราว์เซอร์รองรับการทำงานพร้อมกันผ่าน Web Workers มาตั้งแต่ปี 2012 ใน Chrome 4 ซึ่งในความเป็นจริงแล้ว การได้ยินคำศัพท์ต่างๆ เช่น "ในเทรดหลัก" เป็นต้น อย่างไรก็ตาม Web Worker จะไม่แชร์ข้อมูลที่เปลี่ยนแปลงได้ระหว่างผู้ใช้ แทนที่จะอาศัยการส่งข้อความในการสื่อสาร ที่จริงแล้ว Chrome จัดสรรเครื่องมือ V8 ใหม่ให้กับแต่ละเครื่องมือ (เรียกว่า Isolated) เซลล์แบบแยกจะไม่แชร์โค้ดและออบเจ็กต์ JavaScript ที่คอมไพล์แล้ว ดังนั้นจึงแชร์ข้อมูลที่เปลี่ยนแปลงไม่ได้ เช่น pthreads ไม่ได้

ในทางกลับกัน ชุดข้อความ WebAssembly เป็นชุดข้อความที่แชร์หน่วยความจำ Wasm เดียวกันได้ การจัดเก็บข้อมูลเบื้องหลังของหน่วยความจำที่ใช้ร่วมกันสามารถทำได้ด้วย SharedArrayBuffer ซึ่งเป็น JavaScript แบบดั้งเดิมที่อนุญาตให้แชร์เนื้อหาของ ArrayBuffer เดียวพร้อมกันระหว่างผู้ปฏิบัติงาน เทรด WebAssembly แต่ละเทรดจะทำงานใน Web Worker แต่หน่วยความจำ 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() ซึ่งเทรดทั้ง 2 แบบจะเรียกด้วยในตัวอย่างนี้ ฟังก์ชัน main() จะสร้างชุดข้อความในเบื้องหลังโดยใช้ pthread_create() ซึ่งมีหน้าที่คำนวณค่าลำดับหมายเลขฟิโบนักชีที่สอดคล้องกับค่าของตัวแปร bg_val ในขณะเดียวกัน ฟังก์ชัน main() ที่ทำงานในเทรดเบื้องหน้าจะคำนวณค่านี้สำหรับตัวแปร fg_val เมื่อชุดข้อความในเบื้องหลังทำงานเสร็จแล้ว ระบบจะพิมพ์ผลลัพธ์ออกมา

คอมไพล์เพื่อรองรับ Thread

ประการแรก คุณควรติดตั้ง emscripten SDK ในเวอร์ชัน 1.38.11 ขึ้นไป หากต้องการสร้างโค้ดตัวอย่างที่มีเปิดใช้ชุดข้อความ สำหรับการทำงานในเบราว์เซอร์ เราต้องส่ง Flag เพิ่มเติม 2-3 รายการไปยังคอมไพเลอร์ 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, สร้าง Web Worker สำหรับเทรดแต่ละรายการในเทรด แชร์โมดูลกับผู้ปฏิบัติงานแต่ละคน ในกรณีนี้คือ 2 และจะใช้โมดูลดังกล่าวเมื่อมีการเรียก pthread_create() ผู้ปฏิบัติงานแต่ละคนจะสร้างอินสแตนซ์ของโมดูล Wasm ด้วยหน่วยความจำเดียวกัน ทำให้สามารถทำงานร่วมกัน การเปลี่ยนแปลงใหม่ล่าสุดของ V8 ใน 7.0 นี้แชร์โค้ดดั้งเดิมของโมดูล Wasm ที่ส่งต่อกันระหว่างผู้ปฏิบัติงาน ทำให้แอปพลิเคชันที่ใหญ่มากๆ รองรับผู้ใช้งานจำนวนมากได้ โปรดทราบว่าขนาดพูลเทรดเท่ากับจำนวนชุดข้อความสูงสุดที่แอปพลิเคชันต้องการ ไม่เช่นนั้นการสร้างเทรดอาจล้มเหลว ในขณะเดียวกัน หากกลุ่มเทรดใหญ่เกินไป คุณจะสร้าง Web Worker ที่ไม่จำเป็นซึ่งไม่ต้องทำอะไรเลยนอกจากใช้หน่วยความจำ

วิธีทดลองใช้

วิธีที่รวดเร็วที่สุดในการทดสอบโมดูล WebAssembly คือการเปิดการรองรับชุดข้อความ WebAssembly แบบทดลองใน Chrome 70 เป็นต้นไป ไปที่ URL about://flags ในเบราว์เซอร์ดังที่แสดงด้านล่าง

หน้า Chrome Flag

ต่อมา ให้ค้นหาการตั้งค่าชุดข้อความ WebAssembly แบบทดลองซึ่งมีลักษณะดังนี้

การตั้งค่าชุดข้อความ WebAssembly

เปลี่ยนการตั้งค่าเป็นเปิดใช้ดังที่แสดงด้านล่าง จากนั้นรีสตาร์ทเบราว์เซอร์

เปิดใช้การตั้งค่าชุดข้อความ WebAssembly

หลังจากรีสตาร์ทเบราว์เซอร์แล้ว คุณอาจลองโหลดโมดูล WebAssembly แบบชุดข้อความด้วยหน้า HTML ขั้นต่ำที่มีเฉพาะเนื้อหานี้

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

หากต้องการลองหน้านี้ คุณจะต้องเรียกใช้เว็บเซิร์ฟเวอร์บางรูปแบบและโหลดจากเบราว์เซอร์ ซึ่งจะทำให้โมดูล WebAssembly โหลดและเรียกใช้ได้ การเปิดเครื่องมือสำหรับนักพัฒนาเว็บจะแสดงผลลัพธ์จากการเรียกใช้ และคุณควรจะเห็นผลลัพธ์อย่างเช่นรูปภาพเอาต์พุตด้านล่างในคอนโซล

เอาต์พุตของคอนโซลจากโปรแกรม Fibonacci

ดำเนินการโปรแกรม WebAssembly ที่มีชุดข้อความสำเร็จแล้ว เราขอแนะนำให้คุณลองใช้แอปพลิเคชันแบบชุดข้อความของคุณเองโดยทำตามขั้นตอนที่ระบุไว้ข้างต้น

การทดสอบภาคสนามด้วยช่วงทดลองใช้จากต้นทาง

การลองใช้ชุดข้อความโดยเปิดแฟล็กการทดสอบในเบราว์เซอร์นั้นเหมาะสำหรับการพัฒนา แต่หากต้องการทดสอบแอปพลิเคชันในภาคสนาม ให้ทำโดยใช้สิ่งที่เรียกว่าช่วงทดลองใช้จากต้นทาง

ช่วงทดลองใช้จากต้นทางช่วยให้คุณได้ลองใช้ฟีเจอร์ทดลองกับผู้ใช้โดยรับโทเค็นการทดสอบที่เชื่อมโยงกับโดเมนของคุณ จากนั้นคุณจะทำให้แอปใช้งานได้และคาดว่าจะทำงานในเบราว์เซอร์ที่สามารถรองรับฟีเจอร์ที่คุณกำลังทดสอบ (ในกรณีนี้คือ Chrome 70 เป็นต้นไป) หากต้องการรับโทเค็นของคุณเองเพื่อเรียกใช้ช่วงทดลองใช้จากต้นทาง ให้ใช้แบบฟอร์มของแอปพลิเคชันที่นี่

เราได้โฮสต์ตัวอย่างง่ายๆ ด้านบนไว้โดยใช้โทเค็นช่วงทดลองใช้จากต้นทางเพื่อให้คุณลองใช้ด้วยตัวเองได้โดยไม่ต้องสร้างอะไรเลย

หากต้องการดูว่าเทรด 4 ตัวที่ทำงานพร้อมกันจะทำอะไรได้บ้างสำหรับอาร์ตเวิร์ก ASCII คุณต้องดูการสาธิตนี้ด้วย

ส่งความคิดเห็นถึงเรา

เทรด WebAssembly เป็นวิธีพื้นฐานใหม่ที่มีประโยชน์อย่างยิ่งสำหรับการย้ายแอปพลิเคชันไปยังเว็บ ตอนนี้คุณสามารถเรียกใช้แอปพลิเคชัน C และ C++ รวมถึงไลบรารีที่ต้องใช้การรองรับ pthreads ในสภาพแวดล้อม WebAssembly ได้แล้ว

เราอยากฟังความคิดเห็นจากนักพัฒนาแอปที่ทดลองใช้ฟีเจอร์นี้ เพราะจะช่วยให้ทราบกระบวนการกำหนดมาตรฐานและตรวจสอบประโยชน์ของฟีเจอร์ดังกล่าวได้ วิธีที่ดีที่สุดในการส่งความคิดเห็นคือการรายงานปัญหาและ/หรือมีส่วนร่วมในกระบวนการกำหนดมาตรฐานในกลุ่มชุมชน WebAssembly