WorkerPool API memungkinkan aplikasi web menjalankan kode JavaScript di bagian background, tanpa mem-blok eksekusi halaman utama script.
OverView
Dalam satu waktu operasi intensif web browser, seperti operasi I/O atau perhitungan yang berat, dapat membuat UI tidak responsif. API worker pool menjalankan operasi di bagian background, tanpa memblok UI.Script yang mengeksekusi dalam Worker Pool tidak akan memicu dialog “Unresponsive Script”.
Permission
API membutuhkan user permission. Jika anda ingin merubah default-dialog, anda dapat memanggil google.gears.factory.getPermission()secara eksplisit.
Contoh:// main.js
var workerPool = google.gears.factory.create('beta.workerpool');
workerPool.onmessage = function(a, b, message) {
alert('Received message from worker ' + message.sender + ': \n' + message.body);
};
var childWorkerId = workerPool.createWorkerFromUrl('worker.js');
workerPool.sendMessage(["3..2..", 1, {helloWorld: "Hello world!"}], childWorkerId);
// worker.js
var wp = google.gears.workerPool;
wp.onmessage = function(a, b, message) {
var reply = message.body[0] + message.body[1] + "... " + message.body[2].helloWorld;
wp.sendMessage(reply, message.sender);
Details
Isolasi Kode dan Data
WorkedPool berprilaku seperti sekumpulan proses, daripada sekumpulan thread. Worker tidak membagikan eksekusi state apapun. Merubah sebuah variable dalam satu worker tidak akan menggangu(tidak mempengaruhi) worker manapun. Dan membuat worker, tidak secara otomatis menurunkan kode script dari parent nya.
Anggota dari WorkedPool berinteraksi satu sama lain, hanya melalui pengiriman satu objek pesan.
Anggota dari WorkedPool berinteraksi satu sama lain, hanya melalui pengiriman satu objek pesan.
Batasan
Worker tidak memiliki akses ke DOM(Document Object Model), objek seperti document dan window hanya berada pada halaman utama. Ini adalah konsekuensi dari si worker tidak mau berbagi execution-state.
Walaupun begitu, worker memiliki akses ke semua fungsi-fungsi JavaScript built-in. Kebanyakan method-method Gears dapat juga digunakan, melalui sebuah variable global, yang didefinisikan: google.gears.factory. (terkecuali LocalServer file submitter, yang membutuhkan DOM). Untuk fungsionalitas yang lain, worker dapat meminta halaman utama untuk membawa request.
Usage Pattern
Untuk memahami bagaimana menggunakan API WorkerPool, mari kita lihat contoh berikut:
Urutan Inisialisasi
- Kode JavaScript(“parent” –nya si worker) menggunakan google.gears.factory untuk membuat sebuah WorkerPool wp.
- Parent mengindikasi ke mana pesan harus pergi dengan men-setting wp.onmessage. Hal ini dilakukan sebelum memanggil createWorker(), untuk memastikan tidak ada pesan yang hilang.
- Untuk setiap worker yang baru(“child” worker)
- Parent memanggil wp.createWorkerFromUrl()dengan URL yang mengembalikan keseluruhan script yang akan dimiliki oleh child.
- CreateWorkerFromUrl()dengan cepat mengembalikannya dan parent tetap terus berjalan.
- Secara parallel, child mengambil kode script-nya dan menjalankannya dalam satu waktu. Selama waktu ini, child harus menge-set onmessage handler nya, pada variable global google.gears.workerPool yang telah didefinisikan sebelumnya.
Komunikasi
Worker mengirinkan pesan satu sama lain, dengan menggunakan sendMessage().Anggota manapun pada WorkerPool dapat berkomunikasi dengan member manapun.
Setiap pesan yang terkirim memicu onmessage handler penerima(receiver). Event dari pesan, ditangani layaknya event JavaScript lainnya. Secara particular, pemrosesan disisipkan antar halaman dengan cara yang sama, disana terdapat antrian event, dan event handler selanjutnya tidak dipanggil sampai event sebelumnya kembali.
Setiap pesan yang terkirim memicu onmessage handler penerima(receiver). Event dari pesan, ditangani layaknya event JavaScript lainnya. Secara particular, pemrosesan disisipkan antar halaman dengan cara yang sama, disana terdapat antrian event, dan event handler selanjutnya tidak dipanggil sampai event sebelumnya kembali.
WorkedPool bukan sebuah singleton. Satu halaman dapat menginstansi banyak WorkerPool, dan masing pool ini terisolasi satu sama lain. Hal ini memungkinkan banyak alat pada sebuah halaman, contohnya menggunakan API WorkerPool tanpa takut bertabrakan.
Bagaimana script mengetahui worker ID yang mana mengirmkan pesan kemana. Ada 2 cara umum, yaitu :
- Membuat parameter kedua ke onmessage, yang berisi ID worker pengirim. “dengkuran” worker yang tujuannya untuk mengeksekusi request secara tidak serempak(asynchronously), akan terus menggunakan method ini, merespon kapanpun worker membuat request dengan membabi-buta.
- Menggunakan nilai yang dikembalikan oleh createWorker(), yang merupakan ID dari worker yang baru terbentuk. Worker yang tujuannya adalah untuk mengkoordinasi task-task(biasanya kode “utama” aplikasi JavaScript) yang akan sering menggunakan method ini. ID dapat dikirimkan ke, dan digunakan oleh, anggota WorkPool manapun, tapi ini jarang dibutuhkan.
Cross-OriginsWorkers
Worker dapat di-load menyeberangi asalnya dengan menggunakan method createWorkerFromUrl(). Worker diload meyeberangi asalnya, cara ini berjalan dalam konteks security dari asal dimana mereka di-laod. Hal ini dapat digunakan untuk mengizinkan pengendalian komunikasi melalui halaman-halaman dalam asal(origin) yang berbeda.
Untuk membuat Gears mengeksekusi cross-origin workers, ada beberapa batasan:
- Worker harus dijalankan dengan content-type application/x-gears-worker
- Kode worker harus memanggil google.gears.workerPool.allowCrossOrigin()
Untuk melihat struktur class dan method nya dapat dilihat lebih lanjut di: http://code.google.com/apis/gears/api_workerpool.html
No comments:
Post a Comment