Chrome 70'te denenmeye hazır WebAssembly iş parçacıkları

WebAssembly iş parçacığı desteği, Chrome 70'te kaynak denemesi kapsamında kullanıma sunulmuştur.

Alex Danilo

WebAssembly (Wasm), C++ ve diğer dillerde yazılan kodların derlenmesini sağlayarak web'de çalıştırmanızı sağlar. Yerel uygulamaların çok yararlı bir özelliği, paralel hesaplama için temel öğe olan iş parçacıklarını kullanabilmesidir. Çoğu C ve C++ geliştiricisi, uygulamadaki iş parçacığı yönetimi için standartlaştırılmış bir API olan pthreads hakkında bilgi sahibidir.

WebAssembly Topluluk Grubu, gerçek çoklu iş parçacıklı uygulamaları etkinleştirmek için iş parçacıklarını web'e getirme üzerinde çalışıyor. Bu çalışmanın bir parçası olarak V8, WebAssembly motorundaki iş parçacıkları için Kaynak Denemesi aracılığıyla gerekli desteği uygulamaya koymuştur. Kaynak denemeleri, geliştiricilerin yeni web özelliklerini tam olarak standartlaştırılmadan önce denemelerine olanak tanır. Bu sayede, yeni özellikleri doğrulamak ve iyileştirmek için kritik öneme sahip olan cesur geliştiricilerden gerçek geri bildirimler toplayabiliyoruz.

Chrome 70 sürümü, WebAssembly için iş parçacıklarını destekler. İlgili geliştiricilerin bunları kullanmaya başlamasını ve bize geri bildirim vermesini öneririz.

Mesaj dizileri? Peki ya işçiler?

Tarayıcılar, 2012'den beri Chrome 4'te Web İşleyiciler aracılığıyla paralelliği desteklemektedir. Aslında "ana iş parçacığında" gibi terimleri duymak normaldir. Ancak Web İşleyiciler, değişken verileri aralarında paylaşmaz. Bunun yerine, iletişim için mesaj aktarmaya dayanır. Aslında Chrome, her biri için yeni bir V8 motoru (tecrit adı verilir) ayırır. İzoleler, derlenmiş kodları veya JavaScript nesnelerini paylaşmaz. Bu nedenle, pthreads gibi değişken verileri paylaşamaz.

Öte yandan WebAssembly iş parçacıkları, aynı Wasm belleğini paylaşabilen iş parçacıklarıdır. Paylaşılan belleğin temel depolama alanı, tek bir ArrayBuffer'ın içeriğini çalışanlar arasında eşzamanlı olarak paylaşmaya olanak tanıyan bir JavaScript ilkel olan SharedArrayBuffer ile sağlanır. Her WebAssembly iş parçacığı bir Web Çalışanında çalışır ancak paylaşılan Wasm bellekleri, yerel platformlarda olduğu gibi çalışmasını sağlar. Bu, Wasm iş parçacıklarını kullanan uygulamaların, geleneksel iş parçacıklı uygulamalarda olduğu gibi ortak belleğe erişimi yönetmekten sorumlu olduğu anlamına gelir. C veya C++ ile yazılmış ve pthreads kullanan birçok mevcut kod kitaplığı vardır. Bu kitaplıklar Wasm'e derlenebilir ve gerçek iş parçacıklı modda çalıştırılabilir. Böylece, aynı veriler üzerinde aynı anda daha fazla çekirdeğin çalışması sağlanır.

Basit bir örnek

Burada, iş parçacıkları kullanan basit bir "C" programı örneği verilmiştir.

#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;
}

Bu kod, fg_val ve bg_val olmak üzere 2 değişken bildiren main() işleviyle başlar. Ayrıca, bu örnekteki iki iş parçacığı tarafından çağrılacak fibonacci() adlı bir işlev de vardır. main() işlevi, pthread_create() kullanarak bir arka plan iş parçacığı oluşturur. Bu iş parçacığının görevi, bg_val değişkeninin değerine karşılık gelen Fibonacci sayı dizisi değerini hesaplamaktır. Bu sırada, ön plan iş parçacığında çalışan main() işlevi, fg_val değişkeni için hesaplama yapar. Arka plan iş parçacığı çalıştırmayı tamamladıktan sonra sonuçlar yazdırılır.

Mesaj dizisi desteği için derleme

Öncelikle, tercihen 1.38.11 veya sonraki bir sürüm olan emscripten SDK'sını yüklemeniz gerekir. Tarayıcıda çalıştırılmak üzere iş parçacıkları etkinleştirilmiş örnek kodumuzu derlemek için emscripten emcc derleyicisine birkaç ekstra işaret iletmemiz gerekir. Komut satırımız şu şekilde görünür:

emcc -O2 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -o test.js test.c

"-s USE_PTHREADS=1" komut satırı bağımsız değişkeni, derlenmiş WebAssembly modülü için mesaj dizileri desteğini etkinleştirir ve "-s PTHREAD_POOL_SIZE=2" bağımsız değişkeni, derleyiciye iki (2) mesaj dizisi havuzu oluşturmasını söyler.

Program çalıştırıldığında, WebAssembly modülü yüklenir, iş parçacığı havuzundaki her iş parçacığı için bir Web İşleyici oluşturulur, modül bu işleyicilerin her biri ile paylaşılır (bu durumda 2 tanedir) ve pthread_create() çağrısı yapıldığında bunlar kullanılır. Her çalışan, Wasm modülünü aynı bellekle örneklendirerek birlikte çalışmalarını sağlar. V8'in 7.0 sürümündeki en yeni değişiklikler, çalışanlar arasında aktarılan Wasm modüllerinin derlenmiş yerel kodunu paylaşır. Bu sayede çok büyük uygulamalar bile birçok çalışana ölçeklendirilebilir. İplik havuzu boyutunun, uygulamanızın ihtiyaç duyduğu maksimum iplik sayısına eşit olduğundan emin olmanız gerektiğini unutmayın. Aksi takdirde, iplik oluşturma işlemi başarısız olabilir. Aynı zamanda, iş parçacığı havuzu çok büyükse, bellek kullanmak dışında hiçbir şey yapmayan gereksiz Web İşçileri de oluşturmuş olursunuz.

Nasıl deneyebilirim?

WebAssembly modülümüzü test etmenin en hızlı yolu, Chrome 70'ten itibaren deneysel WebAssembly iş parçacıkları desteğini etkinleştirmektir. Aşağıda gösterildiği gibi tarayıcınızda about://flags URL'sine gidin:

Chrome işaretleri sayfası

Ardından, deneysel WebAssembly iş parçacığı ayarını bulun. Bu ayar şöyle görünür:

WebAssembly mesaj dizileri ayarı

Aşağıda gösterildiği gibi ayarı Etkin olarak değiştirin, ardından tarayıcınızı yeniden başlatın.

WebAssembly mesaj dizileri ayarı etkinleştirildi

Tarayıcı yeniden başlatıldıktan sonra, mesaj dizili WebAssembly modülünü yalnızca şu içeriği içeren minimal bir HTML sayfasıyla yüklemeyi deneyebiliriz:

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

Bu sayfayı denemek için bir tür web sunucusu çalıştırmanız ve tarayıcıdan yüklemeniz gerekir. Bu işlem, WebAssembly modülünün yüklenmesine ve çalışmasına neden olur. DevTools'u açtığınızda çalıştırmanın çıkışı gösterilir. Konsolda aşağıdaki çıkış resmine benzer bir şey görürsünüz:

Fibonacci programından konsol çıkışı

İş parçacıkları içeren WebAssembly programımız başarıyla çalıştırıldı. Yukarıda açıklanan adımları uygulayarak kendi mesaj dizili uygulamanızı denemenizi öneririz.

Kaynak denemesiyle sahada test etme

Tarayıcıda deneysel işaretleri etkinleştirerek ileti dizilerini denemek geliştirme amacıyla iyi bir seçenektir. Ancak uygulamanızı sahada test etmek istiyorsanız bunu kaynak denemesi olarak bilinen yöntemle yapabilirsiniz.

Kaynak denemeleri, alanınıza bağlı bir test jetonu elde ederek deneysel özellikleri kullanıcılarınızla denemenize olanak tanır. Ardından uygulamanızı dağıtabilir ve test ettiğiniz özelliği destekleyebilecek bir tarayıcıda (bu durumda Chrome 70 ve sonraki sürümler) çalışmasını bekleyebilirsiniz. Kaynak deneme sürümü çalıştırmak için kendi jetonunuzu almak üzere buradaki başvuru formunu kullanın.

Yukarıdaki basit örneğimizi, bir kaynak deneme jetonu kullanarak barındırdık. Böylece, herhangi bir şey oluşturmanıza gerek kalmadan kendi kendinize deneyebilirsiniz.

Paralel çalışan 4 iş parçacığının ASCII sanatı için neler yapabileceğini görmek istiyorsanız bu demoya da göz atmalısınız.

Görüşlerinizi bizimle paylaşın

WebAssembly iş parçacıkları, uygulamaları web'e taşımak için son derece kullanışlı yeni bir temel öğedir. Artık WebAssembly ortamında pthreads desteği gerektiren C ve C++ uygulamalarını ve kitaplıklarını çalıştırabilirsiniz.

Standartlaştırma sürecine yön vermemize ve özelliğin kullanışlılığını doğrulamamıza yardımcı olacağından, bu özelliği deneyen geliştiricilerden geri bildirim bekliyoruz. Geri bildirim göndermenin en iyi yolu, WebAssembly Topluluk Grubu'nda sorunları bildirmek ve/veya standartlaştırma sürecine dahil olmaktır.