Dukungan thread WebAssembly telah dikirimkan di Chrome 70 dalam percobaan origin.
WebAssembly (Wasm) memungkinkan kompilasi kode yang ditulis dalam C++ dan bahasa lainnya untuk dijalankan di web. Salah satu fitur aplikasi native yang sangat berguna adalah kemampuan untuk menggunakan thread - primitif untuk komputasi paralel. Sebagian besar developer C dan C++ akan memahami pthreads yang merupakan API standar untuk pengelolaan thread dalam aplikasi.
Grup Komunitas WebAssembly telah bekerja untuk menghadirkan thread ke web guna mengaktifkan aplikasi multi-thread yang sebenarnya. Sebagai bagian dari upaya ini, V8 telah menerapkan dukungan yang diperlukan untuk thread di mesin WebAssembly, yang tersedia melalui Uji Coba Origin. Uji Coba Origin memungkinkan developer bereksperimen dengan fitur web baru sebelum sepenuhnya diseragamkan. Hal ini memungkinkan kami mengumpulkan masukan nyata dari developer yang pemberani, yang sangat penting untuk memvalidasi dan meningkatkan kualitas fitur baru.
Rilis Chrome 70 mendukung thread untuk WebAssembly dan sebaiknya developer yang tertarik mulai menggunakannya dan memberikan masukan kepada kami.
Rangkaian pesan? Bagaimana dengan Pekerja?
Browser telah mendukung paralelisme melalui Web Worker sejak 2012 di Chrome 4; sebenarnya hal yang wajar untuk mendengar istilah seperti 'di thread utama', dll. Namun, Web Worker tidak berbagi data yang dapat diubah di antara mereka, melainkan mengandalkan pengiriman pesan untuk komunikasi. Faktanya, Chrome mengalokasikan mesin V8 baru untuk setiap proses tersebut (disebut isolasi). Isolat tidak berbagi kode yang dikompilasi atau objek JavaScript, sehingga tidak dapat berbagi data yang dapat diubah seperti pthread.
Di sisi lain, thread WebAssembly adalah thread yang dapat berbagi memori Wasm yang sama. Penyimpanan yang mendasari dari memori bersama dijalankan dengan SharedArrayBuffer, primitif JavaScript yang memungkinkan berbagi konten ArrayBuffer tunggal di antara pekerja. Setiap thread WebAssembly berjalan di Web Worker, tetapi memori Wasm bersama memungkinkannya berfungsi seperti yang dilakukan di platform native. Artinya, aplikasi yang menggunakan thread Wasm bertanggung jawab untuk mengelola akses ke memori bersama seperti pada aplikasi berthread tradisional. Ada banyak library kode yang ada yang ditulis dalam C atau C++ yang menggunakan pthreads, dan library tersebut dapat dikompilasi ke Wasm dan dijalankan dalam mode threaded yang sebenarnya, sehingga lebih banyak core dapat bekerja pada data yang sama secara bersamaan.
Contoh sederhana
Berikut adalah contoh program 'C' sederhana yang menggunakan thread.
#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;
}
Kode tersebut dimulai dengan fungsi main()
yang mendeklarasikan 2
variabel fg_val
dan
bg_val
. Terdapat juga fungsi yang disebut
fibonacci()
, yang akan dipanggil oleh kedua
thread dalam contoh ini. Fungsi main()
membuat thread latar belakang menggunakan pthread_create()
yang tugasnya adalah menghitung nilai urutan angka fibonacci yang sesuai dengan
nilai variabel bg_val
. Sementara itu,
fungsi main()
yang berjalan di thread latar depan
menghitungnya untuk variabel fg_val
. Setelah
thread latar belakang selesai berjalan, hasilnya akan dicetak.
Mengompilasi untuk dukungan thread
Pertama, Anda harus menginstal emscripten SDK, sebaiknya versi 1.38.11 atau yang lebih baru. Untuk mem-build kode contoh dengan thread yang diaktifkan untuk dijalankan di browser, kita perlu meneruskan beberapa flag tambahan ke compiler emcc emscripten. Baris perintah kita akan terlihat seperti ini:
emcc -O2 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -o test.js test.c
Argumen command line '-s USE_PTHREADS=1
' mengaktifkan dukungan threading untuk
modul WebAssembly yang dikompilasi dan argumen '-s PTHREAD_POOL_SIZE=2
'
memberi tahu compiler untuk membuat kumpulan dua (2) thread.
Saat program dijalankan, di balik layar, program akan memuat modul WebAssembly,
membuat Web Worker untuk setiap thread dalam kumpulan thread, membagikan modul
ke setiap pekerja, dalam hal ini ada 2, dan modul tersebut akan digunakan setiap kali
panggilan ke pthread_create()
dilakukan. Setiap pekerja membuat instance
modul Wasm dengan memori yang sama, sehingga memungkinkan mereka untuk bekerja sama. Perubahan terbaru
V8 di 7.0 berbagi kode native yang dikompilasi dari modul Wasm yang diteruskan
di antara pekerja, yang memungkinkan aplikasi yang sangat besar untuk diskalakan ke banyak pekerja. Perhatikan, sebaiknya pastikan ukuran kumpulan thread sama dengan
jumlah maksimum thread yang diperlukan aplikasi Anda, atau pembuatan thread dapat gagal.
Pada saat yang sama, jika ukuran kumpulan thread terlalu besar, Anda akan membuat
Web Worker yang tidak diperlukan yang tidak akan melakukan apa pun selain menggunakan memori.
Cara mencobanya
Cara tercepat untuk menguji modul WebAssembly adalah dengan mengaktifkan
dukungan thread WebAssembly eksperimental di Chrome 70 dan yang lebih baru. Buka
URL about://flags
di browser Anda seperti yang ditunjukkan di bawah ini:
Selanjutnya, temukan setelan thread WebAssembly eksperimental yang terlihat seperti ini:
Ubah setelan ke Enabled seperti yang ditunjukkan di bawah, lalu mulai ulang browser.
Setelah browser dimulai ulang, kita dapat mencoba memuat modul WebAssembly threaded dengan halaman HTML minimal, yang hanya berisi konten ini:
<!DOCTYPE html>
<html>
<title>Threads test</title>
<body>
<script src="test.js"></script>
</body>
</html>
Untuk mencoba halaman ini, Anda harus menjalankan beberapa bentuk server web dan memuat dari browser. Tindakan ini akan menyebabkan modul WebAssembly dimuat dan dijalankan. Membuka DevTools akan menampilkan output dari operasi, dan Anda akan melihat sesuatu seperti gambar output di bawah di konsol:
Program WebAssembly kami dengan thread telah berhasil dieksekusi. Sebaiknya Anda mencoba aplikasi dengan rangkaian pesan Anda sendiri menggunakan langkah-langkah yang diuraikan di atas.
Menguji di lapangan dengan Uji Coba Origin
Mencoba thread dengan mengaktifkan flag eksperimental di browser tidak masalah untuk tujuan pengembangan, tetapi jika ingin menguji aplikasi di lapangan, Anda dapat melakukannya dengan yang dikenal sebagai uji coba origin.
Uji coba origin memungkinkan Anda mencoba fitur eksperimental dengan pengguna dengan mendapatkan token pengujian yang terikat dengan domain Anda. Selanjutnya, Anda dapat men-deploy aplikasi dan mengharapkannya berfungsi di browser yang dapat mendukung fitur yang Anda uji (dalam hal ini Chrome 70 dan yang lebih baru). Untuk mendapatkan token Anda sendiri guna menjalankan uji coba origin, gunakan formulir permohonan di sini.
Kami telah menghosting contoh sederhana di atas menggunakan token uji coba origin, sehingga Anda dapat mencobanya sendiri tanpa perlu membangun apa pun.
Jika Anda ingin melihat apa yang dapat dilakukan 4 thread yang berjalan secara paralel untuk seni ASCII, Anda juga harus melihat demo ini.
Berikan masukan Anda
Thread WebAssembly adalah primitif baru yang sangat berguna untuk mem-porting aplikasi ke web. Kini Anda dapat menjalankan aplikasi dan library C dan C++ yang memerlukan dukungan pthreads di lingkungan WebAssembly.
Kami mencari masukan dari developer yang mencoba fitur ini karena akan membantu memberi informasi tentang proses standardisasi serta memvalidasi kegunaannya. Cara terbaik untuk mengirim masukan adalah melaporkan masalah dan/atau terlibat dalam proses standardisasi di WebAssembly Community Group.