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
postMessage
veonmessage
kullanarak ana iş parçacığı ileWorker
iş 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.ts
ayrı bir iş parçacığında çalışır,num1
venum2
'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 veimport
ileexport
kullanmanı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);
MessageEvent
tü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ş
Worker
betiğ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
Worker
iş 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. -
Transferable
NesneleriArrayBuffer
gibi 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,buffer
kopyalanmak yerine İşçi'ye aktarılır. -
Bundan sonra, ana iş parçacığındaki
buffer
boş hale gelir (byteLength
0 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,
terminate
yö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ı
onerror
olayı 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.