Node.js versi 0.10 dirilis hari ini dan diperkenalkan setImmediate
. The perubahan API dokumentasi menyarankan menggunakannya ketika melakukan rekursif nextTick
panggilan.
Dari apa yang dikatakan MDN tampaknya sangat mirip process.nextTick
.
Kapan saya harus menggunakan nextTick
dan kapan saya harus menggunakan setImmediate
?
javascript
node.js
setimmediate
Benjamin Gruenbaum
sumber
sumber
nextTick
lebih cepat daripadasetImmediate
perhitungan besar.setImmediate
dilakukan dengan lebih baik.setImmediate
, tetapi tidak sebelumnyanextTick
?Jawaban:
Gunakan
setImmediate
jika Anda ingin mengantri fungsi di balik callback acara I / O apa pun yang sudah ada dalam antrian acara. Gunakanprocess.nextTick
untuk secara efektif mengantri fungsi di kepala antrian acara sehingga dieksekusi segera setelah fungsi saat ini selesai.Jadi dalam kasus di mana Anda mencoba untuk memecah pekerjaan yang berjalan lama, terikat dengan CPU menggunakan rekursi, Anda sekarang ingin menggunakan
setImmediate
daripadaprocess.nextTick
untuk mengantri pada iterasi berikutnya karena jika tidak, setiap callback acara I / O tidak akan mendapatkan kesempatan. untuk menjalankan antar iterasi.sumber
requestAnimationFrame
karena itu tidak selalu terjadi (saya sudah pasti melihat ini, saya pikir contoh adalah tab bukan tab saat ini) dan dapat dipanggil sebelum halaman selesai melukis (yaitu browser masih sibuk menggambar).Sebagai ilustrasi
akan memberikan output berikut
Saya harap ini dapat membantu untuk memahami perbedaannya.
Diperbarui:
sumber
For example, if we run the following script which is not within an I/O cycle (i.e. the main module), the order in which the two timers are executed is non-deterministic, as it is bound by the performance of the process:
Jadi, jawaban ini tidak benar-benar menjawab perbedaan persis tetapi hanya sebuah contoh yang dapat bervariasi dalam konteks yang berbedaSaya pikir saya bisa menggambarkan ini dengan cukup baik. Karena
nextTick
dipanggil pada akhir operasi saat ini, memanggilnya secara rekursif dapat berakhir memblokir perulangan peristiwa dari melanjutkan.setImmediate
menyelesaikan ini dengan menembakkan pada fase pemeriksaan loop acara, yang memungkinkan loop acara berlanjut secara normal.sumber: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Perhatikan bahwa fase pemeriksaan segera setelah fase polling. Ini karena fase polling dan I / O callback adalah tempat yang paling mungkin
setImmediate
untuk menjalankan panggilan Anda . Jadi idealnya sebagian besar panggilan itu sebenarnya akan sangat segera, hanya saja tidak secepatnextTick
yang diperiksa setelah setiap operasi dan secara teknis ada di luar loop acara.Mari kita lihat sedikit contoh perbedaan antara
setImmediate
danprocess.nextTick
:Katakanlah kita baru saja menjalankan program ini dan sedang melangkah melalui iterasi pertama dari loop acara. Ini akan memanggil
step
fungsi dengan iterasi nol. Kemudian akan mendaftarkan dua penangan, satu untuksetImmediate
dan satu untukprocess.nextTick
. Kami kemudian secara rekursif memanggil fungsi ini darisetImmediate
handler yang akan dijalankan pada tahap pemeriksaan berikutnya. ThenextTick
handler akan berjalan pada akhir operasi saat ini mengganggu loop acara, jadi meskipun itu telah didaftarkan kedua itu benar-benar akan berjalan pertama.Urutan akhirnya adalah:
nextTick
kebakaran saat operasi saat ini berakhir, loop acara berikutnya dimulai, fase loop peristiwa normal dieksekusi,setImmediate
diaktifkan dan secara rekursif memanggilstep
fungsi kami untuk memulai proses dari awal lagi. Operasi saat ini berakhir,nextTick
kebakaran, dll.Output dari kode di atas adalah:
Sekarang mari kita pindahkan panggilan rekursif kita ke
step
dalamnextTick
handler kita alih-alihsetImmediate
.Sekarang kami telah memindahkan panggilan rekursif ke
step
dalamnextTick
handler hal-hal akan berperilaku dalam urutan yang berbeda. Iterasi pertama kami dari loop acara berjalan dan panggilanstep
mendaftarkansetImmedaite
penangan sertanextTick
penangan. Setelah operasi saat ini berakhir,nextTick
penangan kami akan melakukan panggilan secara rekursifstep
dan mendaftarkansetImmediate
penangan yang lain sertanextTick
penangan yang lain . KarenanextTick
pawang menyala setelah operasi saat ini, mendaftarkannextTick
pawang dalamnextTick
pawang akan menyebabkan pawang kedua berjalan segera setelah operasi pawang saat ini selesai. ThenextTick
penangan akan terus menembak, mencegah event loop arus dari yang pernah melanjutkan. Kami akan melewati semua kaminextTick
penangan sebelum kita melihatsetImmediate
api penangan tunggal .Hasil akhir dari kode di atas adalah:
Perhatikan bahwa jika kita tidak menginterupsi panggilan rekursif dan membatalkannya setelah 10 iterasi maka
nextTick
panggilan akan terus berulang dan tidak pernah membiarkan loop acara berlanjut ke fase berikutnya. Ini adalah bagaimananextTick
bisa menjadi pemblokiran ketika digunakan secara rekursif sedangkansetImmediate
akan menyala di loop acara berikutnya dan pengaturansetImmediate
handler lain dari dalam satu tidak akan mengganggu loop acara saat ini sama sekali, yang memungkinkannya untuk melanjutkan menjalankan fase-fase dari loop acara seperti biasa.Semoga itu bisa membantu!
PS - Saya setuju dengan komentator lain bahwa nama kedua fungsi dapat dengan mudah ditukar karena
nextTick
terdengar seperti itu akan menyala di loop acara berikutnya daripada akhir yang sekarang, dan akhir dari loop saat ini lebih "segera "Dari awal loop berikutnya. Oh well, itulah yang kami dapatkan ketika API matang dan orang-orang bergantung pada antarmuka yang ada.sumber
Dalam komentar di jawaban, itu tidak secara eksplisit menyatakan bahwa nextTick bergeser dari Macrosemantics ke Microsemantics.
sebelum node 0.9 (ketika setImmediate diperkenalkan), nextTick dioperasikan pada awal callstack berikutnya.
sejak node 0.9, nextTick beroperasi di akhir dari callstack yang ada, sedangkan setImmediate adalah pada awal dari callstack berikutnya
lihat https://github.com/YuzuJS/setImmediate untuk alat dan detail
sumber
Dalam istilah sederhana, process.NextTick () akan dieksekusi pada tick berikutnya dari loop acara. Namun, setImmediate, pada dasarnya memiliki fase terpisah yang memastikan bahwa callback yang terdaftar di bawah setImmediate () akan dipanggil hanya setelah fase callback dan polling IO.
Silakan merujuk ke tautan ini untuk penjelasan yang bagus: https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and -its-metrics-c4907b19da4c
sumber
Beberapa jawaban bagus di sini merinci bagaimana keduanya bekerja.
Hanya menambahkan satu yang menjawab pertanyaan spesifik yang diajukan:
Selalu gunakan
setImmediate
.The Node.js Acara Loop Timers, dan
process.nextTick()
doc meliputi berikut ini:Sebelumnya dalam dokumen itu diperingatkan bahwa
process.nextTick
...Ternyata,
process.nextTick
bahkan bisa kelaparanPromises
:Di sisi lain,
setImmediate
" lebih mudah untuk dipertimbangkan " dan menghindari jenis masalah ini:Jadi kecuali ada kebutuhan khusus untuk perilaku unik
process.nextTick
, pendekatan yang disarankan adalah " digunakansetImmediate()
dalam semua kasus ".sumber
Saya sarankan Anda untuk memeriksa bagian dokumen yang didedikasikan untuk Loop untuk mendapatkan pemahaman yang lebih baik. Beberapa cuplikan diambil dari sana:
Kami memiliki dua panggilan yang sama sejauh menyangkut pengguna, tetapi nama mereka membingungkan.
process.nextTick () langsung aktif pada fase yang sama
setImmediate () diaktifkan pada iterasi berikut atau 'centang' dari
loop acara
Intinya, nama harus ditukar. process.nextTick () dijalankan lebih cepat daripada setImmediate (), tetapi ini adalah artefak dari masa lalu yang tidak mungkin berubah.
sumber