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

WebAssembly iş parçacığı desteği, kaynak deneme sürümü kapsamında Chrome 70'te kullanıma sunulmuştur.

Alex Danilo

WebAssembly (Wasm), C++ ve diğer dillerde yazılmış kodların web'de çalıştırılmasını sağlar. Yerel uygulamaların çok kullanışlı bir özelliği, paralel hesaplama için temel bir özellik olan iş parçacıklarını kullanabilmedir. Çoğu C ve C++ geliştiricisi, bir uygulamadaki iş parçacığı yönetimi için standartlaştırılmış bir API olan pthreads konusuna aşinadır.

WebAssembly Topluluk Grubu, gerçek çok iş parçacıklı uygulamaları etkinleştirmek için ileti dizilerini web'e taşımaya çalışıyor. Bu çalışmaların parçası olarak V8, WebAssembly motorundaki iş parçacıkları için Kaynak Denemesi aracılığıyla kullanılabilen gerekli desteği sunmuştur. Kaynak Denemeleri, geliştiricilerin tam olarak standartlaştırılmadan önce yeni web özelliklerini denemelerine olanak tanır. Bu, cesur geliştiricilerden gerçek geri bildirimler toplamamıza olanak tanır ve bu da yeni özellikleri doğrulamak ve iyileştirmek için kritik öneme sahiptir.

Chrome 70 sürümü WebAssembly için iş parçacıklarını desteklemektedir. Konuyla ilgilenen geliştiricilerin ise bunları kullanmaya ve bize geri bildirimde bulunmalarını öneririz.

İleti dizileri mi? Peki ya Çalışanlar?

Tarayıcılar, 2012'den beri Chrome 4'te Web İşçileri aracılığıyla paralelliği desteklemektedir. Aslında, "ana iş parçacığında" gibi terimleri duymak normaldir. Ancak, Web Çalışanları arasında değişken verileri paylaşmaz, bunun yerine iletişim için ileti geçirme özelliğinden yararlanırlar. Aslında Chrome bunların her biri için yeni bir V8 motoru ayırır (izolasyon adı verilir). Yalıtımlar ne derlenmiş kodu ne de JavaScript nesnelerini paylaşır ve bu nedenle pthreads gibi değişken verileri paylaşamaz.

WebAssembly iş parçacıkları ise aynı Wasm belleğini paylaşabilen iş parçacıklarıdır. Paylaşılan belleğin temelde depolama işlemi, tek bir ArrayBuffer içeriğinin çalışanlar arasında eş zamanlı olarak paylaşılmasına olanak tanıyan bir JavaScript temel öğesi olan SharedArrayBuffer ile yapılır. Her WebAssembly iş parçacığı bir Web Çalışanı içinde çalışır ancak paylaşılan Wasm belleği, yerel platformlarda olduğu gibi çalışmalarını sağlar. Bu, herhangi bir geleneksel iş parçacığı uygulamasında olduğu gibi, paylaşılan belleğe erişimi yönetmekten Wasm iş parçacıklarını kullanan uygulamaların sorumlu olduğu anlamına gelir. C veya C++'ta yazılmış ve pthreads kullanan çok sayıda mevcut kod kitaplığı vardır. Bu kitaplıklar, Wasm'a derlenip gerçek iş parçacığı modunda çalıştırılabilir. Böylece daha fazla çekirdeğin aynı veri üzerinde aynı anda çalışması sağlanır.

Basit bir örnek

Aşağıda, 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, 2 değişken fg_val ve bg_val bildiren main() işleviyle başlar. Ayrıca, bu örnekteki her iki iş parçacığı tarafından çağrılacak fibonacci() adlı bir işlev de vardır. main() işlevi, pthread_create() işlevini kullanarak bir arka plan iş parçacığı oluşturur. Bu iş parçacığı, bg_val değişkeninin değerine karşılık gelen fibonacci sayısı dizisi değerini hesaplamaktır. Bu arada, ön plan iş parçacığında çalışan main() işlevi bunu fg_val değişkeni için hesaplar. Arka plan iş parçacığının çalışması tamamlandıktan sonra sonuçlar yazdırılır.

İleti dizisi desteği için derleme

Öncelikle emscripten SDK'yı (tercihen 1.38.11 veya üzeri bir sürüm) yüklemiş olmanız gerekir. Örnek kodumuzu, tarayıcıda çalıştırmak üzere iş parçacıkları etkinleştirilmiş şekilde oluşturmak için emscripten emcc derleyicisine birkaç ekstra işaret iletmemiz gerekir. Komut satırımız şöyle 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 iş parçacığı oluşturma desteğini etkinleştirir ve "-s PTHREAD_POOL_SIZE=2" bağımsız değişkeni, derleyiciye iki (2) iş parçacığı içeren bir havuz oluşturmasını bildirir.

Program çalıştırıldığında, arka planda WebAssembly modülünü yükler, iş parçacığı havuzundaki iş parçacıklarının her biri için bir Web Çalışanı oluşturur, modülü çalışanların her biriyle paylaşır. Bu örnekte 2'dir ve her pthread_create() çağrısı yapıldığında bu modül kullanılır. Her çalışan, Wasm modülünü aynı bellekle örneklendirerek iş birliği yapmalarını sağlar. V8'in 7.0 sürümündeki en yeni değişiklikleri, çalışanlar arasında iletilen Wasm modüllerinin derlenmiş yerel kodunu paylaşır. Bu sayede çok büyük uygulamalar bile birçok çalışana göre ölçeklendirilebilir. İş parçacığı havuzu boyutunun, uygulamanızın ihtiyaç duyduğu maksimum iş parçacığı sayısına eşit olduğundan emin olmanız gerektiğini unutmayın. Aksi takdirde iş parçacığı oluşturma işlemi başarısız olabilir. Aynı zamanda, iş parçacığı havuzunun boyutu çok büyükse bellek kullanmak dışında bir şey yapmadan gereksiz Web İşçileri de oluşturmuş olursunuz.

Nasıl deneyebilirsiniz?

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

Chrome flag&#39;leri sayfası

Ardından, aşağıdakine benzeyen deneysel WebAssembly iş parçacıkları ayarını bulun:

WebAssembly iş parçacıkları ayarı

Ayarı aşağıda gösterildiği gibi Etkin olarak değiştirin ve tarayıcınızı yeniden başlatın.

WebAssembly iş parçacıkları ayarı etkinleştirildi

Tarayıcı yeniden başlatıldıktan sonra, iş parçacıklı WebAssembly modülünü minimal HTML sayfası ile yüklemeyi deneyebiliriz. Bu modül, sadece şu içeriği barındırmaktadır:

<!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ınızdan yüklemeniz gerekir. Bu, WebAssembly modülünün yüklenip çalışmasına neden olur. Geliştirici Araçları'nı açtığınızda çalıştırmanın çıktısı gösterilir. Konsolda aşağıdaki çıkış görüntüsüne benzer bir sonuç görürsünüz:

Fibonacci programından konsol çıkışı

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

Kaynak denemesi ile sahada test etme

Tarayıcıda deneysel işaretleri etkinleştirerek iş parçacıklarını denemeniz, geliştirme açısından bir sorun oluşturmaz ancak uygulamanızı sahada test etmek isterseniz bunu kaynak denemesi olarak bilinen yöntemle yapabilirsiniz.

Kaynak denemeleri, alanınıza bağlı bir test jetonu alarak deneysel özellikleri kullanıcılarınızla denemenize olanak tanır. Daha sonra uygulamanızı dağıtabilir ve test ettiğiniz özelliği (bu örnekte Chrome 70 ve sonrası) destekleyebilen bir tarayıcıda çalışmasını bekleyebilirsiniz. Kaynak denemesi çalıştırmak üzere kendi jetonunuzu almak için buradaki başvuru formunu kullanın.

Yukarıdaki basit örneğimizi kaynak deneme jetonu kullanarak barındırdık. Böylece, hiçbir şey derlemeye gerek kalmadan bu jetonu kendiniz 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 atmanız gerekir.

Geri bildirimlerinizi bizimle paylaşın

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

Bu özelliği deneyen geliştiricilerden geri bildirim bekliyoruz. Bu, standartlaştırma süreci hakkında bilgilendirilmesine ve kullanışlılığını doğrulamaya yardımcı olacaktır. Geri bildirim göndermenin en iyi yolu, sorunları bildirmek ve/veya WebAssembly Topluluk Grubu'ndaki standartlaştırma sürecine dahil olmaktır.