TypeScript'te Web Worker
Bu makale, TypeScript'te Web Worker'ları açıklamaktadır.
Web Worker kavramı ve çeşitli kullanım ipuçlarını örneklerle öğrenebilirsiniz.
YouTube Video
TypeScript'te Worker
TypeScript'te bir Worker, JavaScript Web Worker API'sinden yararlanarak, ana iş parçacığından ayrı olarak arka planda işlem gerçekleştirme mekanizmasıdır. Bu, yoğun hesaplamaların ve asenkron görevlerin kullanıcı arayüzünün işleyişini etkilemeden gerçekleştirilebilmesini sağlar.
Bir Worker, ana iş parçacığı (UI iş parçacığı) ile paralel çalışır ve iş parçacıkları arasında mesajlar yoluyla veri alışverişi yapabilir. TypeScript'te bile, tür güvenli bir kod yazarken Worker kullanabilirsiniz.
Worker'ın Temel Kullanımı
-
Worker Oluşturma
Workerörneği oluşturun ve belirtilen betiği çalıştırın. Normalde, betik ayrı bir dosyada tanımlanır. -
Mesaj Alışverişi
postMessageveonmessagekullanarak ana iş parçacığı ileWorkeriş parçacığı arasında mesaj gönderip alabilirsiniz.
Örnek: Temel Worker Uygulaması
- worker.ts: Worker için Betik
1// worker.ts
2self.onmessage = (event) => {
3 const data = event.data;
4 const result = data.num1 + data.num2;
5 self.postMessage(result); // Return the result to the main thread
6};- main.ts: Ana İş Parçacığında Worker Kullanımı için Betik
1// main.ts
2const worker = new Worker(
3 new URL('./worker.ts', import.meta.url),
4 { type: 'module' }
5);
6
7worker.onmessage = (event) => {
8 console.log("Result from worker:", event.data); // Receive message from the worker
9};
10
11worker.postMessage({ num1: 10, num2: 20 }); // Send message to the worker
- Bu örnekte,
worker.tsayrı bir iş parçacığında çalışır,num1venum2'nin toplamını hesaplar ve bunu ana iş parçacığına geri döndürür. Ana iş parçacığı sonucu alır ve konsola çıktısını verir. type: 'module'olarak belirttiğinizde, Worker betiği bir ES modülü olarak yorumlanır veimportileexportkullanmanıza olanak tanır. Bu, gelenekselimportScripts()kullanmadan modül yapılarını yönetmenizi sağlar.
TypeScript'te Worker Kullanırken Dikkat Edilmesi Gereken Noktalar
Tür Tanımlamalarını Eklemek
TypeScript'te, mesaj gönderme ve alma sırasında tür güvenli etkileşimi sağlamak için veri türlerini tanımlayın.
1// Define data types
2interface WorkerData {
3 num1: number;
4 num2: number;
5}
6
7interface WorkerResult {
8 result: number;
9}
10
11// worker.ts
12self.onmessage = (event: MessageEvent<WorkerData>) => {
13 const data = event.data;
14 const result = data.num1 + data.num2;
15 const message: WorkerResult = { result };
16 self.postMessage(message); // Send the result in a type-safe manner
17};
18
19// main.ts
20const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
21
22// Type the event from the worker
23worker.onmessage = (event: MessageEvent<WorkerResult>) => {
24 console.log("Result from worker:", event.data); // event.data is number
25};
26
27// Send typed data to the worker
28const message: WorkerData = { num1: 10, num2: 20 };
29worker.postMessage(message);MessageEventtür parametresini belirleyerek alınacak verinin türünü açıkça tanımlayabilirsiniz. Bu, verilerin tür güvenliği ile değişimini sağlar.
Webpack veya Vite Kurulumu
TypeScript'te Worker kullanırken, Webpack veya Vite gibi paketleyicilere ihtiyaç duyulabilir. Bu araçları kullanarak, Worker betiğini doğru bir şekilde paketleyebilir ve ana iş parçacığından erişilebilir hale getirebilirsiniz.
Örneğin, Vite kullanırken, Worker'ı doğru şekilde içe aktarmak için import.meta.url kullanın.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });- Bu, paketlenmiş
Workerbetiğinin doğru şekilde yüklenmesini veWorker'dan yararlanılarak işlem yapılmasını sağlar.
Mesajlaşma ve Paralellik Konusunda Dikkat Edilmesi Gerekenler
-
Veri Kopyalama
Ana iş parçacığı ile
Workeriş parçacığı arasında mesaj gönderip alırken, veriler kopyalanır. Nesneler gibi karmaşık verilerle çalışırken verimlilik göz önünde bulundurulmalıdır. Büyük miktarda verilerin sık sık değiştirilmesi performansı düşürebilir. -
TransferableNesneleriArrayBuffergibi bazı nesnelereTransferable(Aktarılabilir) nesneler denir.Transferable(Aktarılabilir) nesneler, mesajlaşma sırasında kopyalanmak yerine İşçi'ye aktarılabilir. Bu, veri kopyalama yükünden kaçınmanızı sağlar.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2
3const buffer = new ArrayBuffer(1024);
4worker.postMessage(buffer, [buffer]); // Transfer ownership to the Worker
5
6console.log(buffer.byteLength); // 0 (ownership moved)
-
worker.postMessage()fonksiyonuna ikinci argüman olarak[buffer]geçirildiğinde,bufferkopyalanmak yerine İşçi'ye aktarılır. -
Bundan sonra, ana iş parçacığındaki
bufferboş hale gelir (byteLength0 olur) ve yalnızca İşçi tarafından kullanılabilir.
Bir Worker'ı Sonlandırma
Worker kullanılma sonrası bellek tüketimini en aza indirmek için sonlandırılmalıdır. Worker'ı terminate metodu ile sonlandırabilirsiniz.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2// ...
3
4worker.terminate(); // Terminate the Worker
- Bu kod,
terminateyöntemi kullanarak İşçi'yi sonlandırır.
Worker'da Hata Yönetimi
Worker içinde bir hata meydana gelirse, hatayı onerror olayı ile ele alabilirsiniz.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2
3worker.onerror = (error) => {
4 console.error("Error in Worker:", error.message);
5};- Bu kod, İşçi içinde oluşan hataları
onerrorolayı ile yakalar ve yönetir.
Özet
TypeScript'te Worker kullanarak, ana iş parçacığını sorunsuz tutarken ağır görevleri arka planda çalıştırabilirsiniz. Tip tanımları kullanarak, mesaj alışverişleri de tip güvenli bir şekilde yapılabilir. Veri alışverişi ve iş parçacığı yönetimine dikkat ederek performans iyileştirmeleri ve verimli paralellik sağlayabilirsiniz.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.