נכון ל-crbug.com/73313, גרסאות Chrome 13 ו-FF5 תומכות בשליחת ArrayBuffer
(או מערך מוגדר) אל Web Worker או ממנו. לדוגמה:
worker.js
self.onmessage = function(e) {
var uInt8Array = e.data;
postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};
main.html
var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}
console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);
worker.postMessage(uInt8Array);
למה זה מרגש?…נתונים בינאריים!
במקום שהדפדפן יבצע סריאליזציה של נתוני postMessage()
לאובייקט JSON, הוא משתמש באלגוריתם ליצירת עותקים מובְנים כדי להעתיק את ArrayBuffer
להקשר של העובד, ולהפך. כך נפתח פוטנציאל אמיתי לעובדים שלא ראינו בעבר. כלומר, אפשר להעביר בקלות נתונים בינאריים בין האפליקציה הראשית לבין שרשור העבודה.
באמצעות קלט/פלט של מערך מוגדר סוג, קל יותר לבצע מניפולציות אינטנסיביות של תמונות, עיבוד אודיו וחישובים כבדים של WebGL. לדוגמה, אפשר לקרוא קובץ כמאגר של מערך או לאחזר Blob באמצעות XHR2 ולהעביר את התוצאה ישירות לעובד. אין יותר צורך בקידוד base64 של הנתונים :)
לדעתי, זו אחת מהנקודות הקטנות שהעובדים היו צריכים לכלול מההתחלה. זה פשוט הגיוני.