Apa kasus penggunaan untuk Pekerja Web? [Tutup]

174

Saya mencari scenarious dunia nyata untuk menggunakan Web Workers API .

Sergey Ilinsky
sumber
Apakah mereka didukung oleh platform mobile / webkit?
dmp
Tidak tahu pasti, tetapi akan menebak mereka.
Sergey Ilinsky
6
@danp Dukungan browser: caniuse.com/webworkers
Dheeraj Vepakomma
1
Saya menulis sebuah kasus di mana kami pertama kali menggunakan pekerja web, kemudian memutuskan bahwa kami lebih baik tanpanya - windward.net/blogs/web-workers-abandon/#.Vl3QdXarQ-U
David Thielen

Jawaban:

143
  • John Resig (dari jQuery fame) memiliki banyak contoh menarik tentang menggunakan pekerja web di sini - game, grafik, crypto.

  • Penggunaan lain adalah Web I / O - dengan kata lain, polling URL di latar belakang. Dengan begitu Anda tidak memblokir UI menunggu hasil polling.

  • Penggunaan praktis lainnya: di Bespin, mereka menggunakan Pekerja Web untuk melakukan penyorotan sintaksis, yang Anda tidak ingin memblokir pengeditan kode Anda saat Anda menggunakan aplikasi.

  • Dari Mozilla : Salah satu cara yang berguna para pekerja adalah memungkinkan kode Anda untuk melakukan perhitungan intensif prosesor tanpa memblokir utas antarmuka pengguna.

    Sebagai contoh praktis, pikirkan aplikasi yang memiliki tabel besar #s (ini adalah dunia nyata, BTW - diambil dari aplikasi yang saya programkan ~ 2 tahun yang lalu). Anda dapat mengubah satu # dalam tabel melalui bidang input dan sekelompok angka lain dalam kolom yang berbeda dapat dihitung ulang dalam proses yang cukup intensif.

    Alur kerja yang lama adalah: Ubah #. Pergi mendapatkan kopi sementara JavaScript berderak melalui perubahan ke nomor lain dan halaman web tidak responsif selama 3 menit - setelah saya mengoptimalkannya ke neraka dan kembali. Dapatkan Kembali dengan kopi. Ubah yang kedua. Ulangi berkali-kali. Klik tombol SIMPAN.

    Alur kerja baru dengan para pekerja bisa menjadi: Ubah #. Dapatkan pesan status bahwa ada sesuatu yang sedang dihitung ulang tetapi Anda dapat mengubah #s lainnya. Ubah lebih banyak #s. Setelah selesai diubah, tunggu hingga perubahan status menjadi "semua perhitungan selesai, kini Anda dapat meninjau # terakhir dan menyimpan".

DVK
sumber
5
Tautan bagus! Saya belum pernah mendengar tentang Pekerja ... mmm, Pekerja. (Waktu untuk mandi air panas yang panjang ...)
Peter Rowell
51
Saya tahu ini adalah jawaban dua tahun, tapi saya hanya ingin mengatakan bahwa Anda tidak perlu Pekerja Web untuk item # 2 (URL polling). XHR terjadi secara tidak sinkron dan tidak memblokir; tidak perlu menjalankan permintaan XHR pada utas terpisah. (Tentu saja, dalam aplikasi modern Anda ingin menggunakan WebSockets daripada polling.)
josh3736
6
@ josh3736 - Anda benar tetapi saya sekarang ingin tahu apakah melakukan banyak permintaan aync XHR paralel dapat membuat browser tidak bahagia? Juga, Anda memerlukan sumber daya lokal untuk memproses respons XHR di mana para pekerja mungkin berguna.
DVK
Jika semua permintaan paralel ke server yang sama, Anda akan mencapai batas per-hostname di suatu tempat antara 2 dan 9 koneksi bersamaan. (Saya berasumsi bahwa batas berlaku untuk semua koneksi, baik yang dimulai dari utas utama atau pekerja.) Tentu saja, jika Anda memiliki 10 permintaan bersamaan yang berjalan pada satu waktu, Anda mungkin perlu memikirkan kembali desain aplikasi Anda.
josh3736
2
Maafkan pertanyaan sederhana saya, tetapi apa yang Anda sebut sebagai "#" dalam contoh Anda di atas?
shrewdbeans
35

Saya telah menggunakannya untuk mengirim data dalam jumlah besar dari browser ke server. Jelas, Anda dapat melakukan ini dengan panggilan AJAX biasa, tetapi jika ini mengambil salah satu koneksi berharga per nama host. Juga, jika pengguna melakukan transisi halaman selama proses ini (misalnya mengklik tautan), objek JavaScript Anda dari halaman sebelumnya hilang dan Anda tidak dapat memproses panggilan balik. Ketika pekerja web digunakan, aktivitas ini terjadi di luar jalur, sehingga Anda memiliki jaminan yang lebih baik bahwa itu akan selesai.

Kevin Hakanson
sumber
2
Tetapi Anda harus bertukar pesan dengan pekerja web. Kapan biaya operasi ini layak mendapatkan manfaat?
Danielo515
6

Kasus Penggunaan lain:

Mengkompresi / menghapus kompresi file di latar belakang, jika Anda memiliki banyak gambar dan file media lain yang dipertukarkan dari server dalam format terkompresi.

sbr
sumber
39
Ini seharusnya tidak terjadi dalam JavaScript. Gambar sudah dikompresi (PNG, JPEG) menggunakan algoritma yang dirancang untuk mengompres data gambar secara efisien. Melemparkan lapisan kompresi lain di atas sebenarnya dapat meningkatkan ukuran data. Untuk tipe data lainnya (mis. File JSON besar), kompresi harus ditangani oleh browser menggunakan gzipping HTTP standar. Jika Anda melakukan kompresi dalam JavaScript, Anda mungkin salah melakukannya .
josh3736
11
Saya melihat beberapa pengguna mendiskualifikasi use case, tapi inilah yang saya katakan. pertimbangkan aplikasi seperti MS word, seperti editor dokumen yang kuat di mana Anda dapat menanamkan gambar, file musik, data, excel sheet dll semua dalam SATU file. dan pertimbangkan bahwa Anda memiliki klien berbasis web dan klien desktop dan klien iOS / Android. Untuk jenis penggunaan seperti ini, Anda dapat menyimpan semua konten file dalam file zip dan kemudian unzip di setiap klien.
sbr
3
Bookmarklet Instapaper mengompres halaman yang disimpan sebelum dikirim ke server. Menghemat waktu dan bandwidth.
stevendaniels
12
@ josh3736 Satu-satunya hal yang dapat dilakukan browser adalah gunzip file dari server web (atau cache browser). Itu tidak bisa mendekompresi data dari penyimpanan lokal, atau dari websocket, dan itu tidak bisa dikompres sama sekali. Aplikasi web mengirimkan jumlah data yang semakin meningkat ke hulu, dan kompresi untuk ini sangat berguna. Sama validnya setahun yang lalu ketika ini diposting: Jika Anda tidak bisa memikirkan kasus penggunaan apa pun yang valid untuk kompresi JavaScript, Anda mungkin kurang imajinasi.
Adria
1
@Adria: Standar websocket sedang dalam proses menambahkan dukungan kompresi . Jika Anda berurusan dengan gambar yang dihasilkan di browser ( <canvas>), Anda bisa mendapatkan data gambar dalam format terkompresi (yaitu png). Maksud saya bukanlah bahwa tidak pernah tepat untuk mengompres di JS; maksud saya adalah bahwa dalam kebanyakan kasus , tidak , dan untuk kebanyakan kasus - terutama berurusan dengan gambar, yang dibicarakan jawaban ini - ada alternatif yang lebih baik untuk menggulirkan kompresi Anda sendiri.
josh3736