Saya telah membaca nodebeginner Dan saya menemukan dua bagian kode berikut.
Yang pertama:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
Yang kedua:
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
});
console.log("Hello World");
Saya mendapatkan apa yang seharusnya mereka lakukan, mereka meminta basis data untuk mengambil jawaban atas permintaan. Dan kemudian console.log('Hello world')
.
Yang pertama seharusnya kode sinkron. Dan yang kedua adalah kode asinkron.
Perbedaan antara keduanya sangat samar bagi saya. Apa yang akan menjadi output?
Googling pada pemrograman asinkron juga tidak membantu saya.
javascript
node.js
asynchronous
synchronous
Azeirah
sumber
sumber
database.query()
, maka saya harus menyebutnya sebagai sinkron, bukan? atau apa yang harus menjadi pendekatan? (Pertanyaan ini sudah lama saya miliki)Jawaban:
Perbedaannya adalah bahwa pada contoh pertama , program akan memblokir di baris pertama. Baris berikutnya (
console.log
) harus menunggu.Dalam contoh kedua ,
console.log
akan dieksekusi SAAT permintaan sedang diproses. Artinya, kueri akan diproses di latar belakang, sementara program Anda melakukan hal-hal lain, dan setelah data kueri siap, Anda akan melakukan apa pun yang Anda inginkan dengannya.Jadi, singkatnya: Contoh pertama akan memblokir, sedangkan yang kedua tidak.
Output dari dua contoh berikut:
Akan menjadi:
Query finished
Next line
Next line
Query finished
Catatan
Meskipun Node itu sendiri berulir tunggal , ada beberapa tugas yang dapat berjalan secara paralel. Misalnya, operasi Sistem File terjadi dalam proses yang berbeda.
Itu sebabnya Node dapat melakukan operasi async: satu utas sedang melakukan operasi sistem file, sedangkan utas utama terus mengeksekusi kode javascript Anda. Di server yang digerakkan oleh peristiwa seperti Node, utas sistem file memberi tahu utas Node utama pada peristiwa tertentu seperti penyelesaian, kegagalan, atau kemajuan, bersama dengan data apa pun yang terkait dengan peristiwa itu (seperti hasil kueri basis data atau kesalahan pesan) dan utas Node utama memutuskan apa yang harus dilakukan dengan data itu.
Anda dapat membaca lebih lanjut tentang ini di sini: Bagaimana model IO non-blocking tunggal bekerja di Node.js
sumber
request query.; 5 seconds later when the request is done; console.log
:; ketika kedua mengeksekusi:request query; console.log; work on the query
;database.query
selesai begitu cepat sehingga pada saat kita mencapaiconsole.log
tugas sudah selesai.console.log("Next line");
dalam contoh 2 ada di dalam fungsi anonim, jadi setelah ituconsole.log("query finished");
, itu berarti "Baris Berikutnya" akan dicetak SETELAH "permintaan selesai" kan? Jadi, jika saya memiliki semuanya dengan cara bersarang, semuanya akan berjalan secara sinkron, maka saya tidak perlu khawatir tentang menggunakan versi sinkron dari fungsi-fungsi tertentu. Apakah saya benar dalam pengertian saya?Perbedaan antara kedua pendekatan ini adalah sebagai berikut:
Cara sinkron: Menunggu setiap operasi untuk menyelesaikan, setelah itu hanya menjalankan operasi berikutnya. Untuk kueri Anda:
console.log()
Perintah tidak akan dieksekusi sampai & kecuali kueri telah selesai dieksekusi untuk mendapatkan semua hasil dari Database.Cara asinkron: Tidak pernah menunggu setiap operasi untuk menyelesaikan, melainkan menjalankan semua operasi di GO pertama saja. Hasil dari setiap operasi akan ditangani setelah hasilnya tersedia. Untuk kueri Anda:
console.log()
Perintah akan dieksekusi segera setelahDatabase.Query()
metode. Sementara kueri Database berjalan di latar belakang dan memuat hasilnya setelah selesai mengambil data.Gunakan kasing
Jika operasi Anda tidak melakukan pengangkatan yang sangat berat seperti meminta data besar dari DB kemudian lanjutkan dengan cara Sinkron atau cara Asinkron.
Dengan cara Asinkron Anda dapat menampilkan beberapa indikator Kemajuan kepada pengguna sementara di latar belakang Anda dapat melanjutkan pekerjaan berat Anda. Ini adalah skenario ideal untuk aplikasi GUI.
sumber
console.log
?Ini akan menjadi sedikit lebih jelas jika Anda menambahkan baris ke kedua contoh:
Yang kedua:
Coba jalankan ini, dan Anda akan melihat bahwa contoh pertama (sinkron), result.length akan dicetak SEBELUM garis 'Hello World'. Dalam contoh kedua (asinkron), panjang result.length akan (kemungkinan besar) akan dicetak SETELAH garis "Hello World".
Itu karena dalam contoh kedua,
database.query
dijalankan secara tidak sinkron di latar belakang, dan skrip berlanjut langsung dengan "Hello World". Iniconsole.log(result.length)
hanya dieksekusi ketika permintaan basis data telah selesai.sumber
Pertama, saya sadar saya terlambat menjawab pertanyaan ini.
Sebelum membahas tentang sinkron dan asinkron, mari kita lihat secara singkat bagaimana program berjalan.
Dalam kasus sinkron , setiap pernyataan selesai sebelum pernyataan berikutnya dijalankan. Dalam hal ini program dievaluasi sesuai dengan urutan pernyataan.
Ini adalah cara kerja asinkron dalam JavaScript. Ada dua bagian dalam mesin JavaScript, satu bagian yang melihat kode dan operasi enqueues dan lainnya yang memproses antrian. Pemrosesan antrian terjadi dalam satu utas, itulah sebabnya mengapa hanya satu operasi yang dapat terjadi sekaligus.
Ketika operasi asinkron (seperti permintaan basis data kedua) terlihat, kode diuraikan dan operasi dimasukkan dalam antrian, tetapi dalam hal ini panggilan balik terdaftar untuk dijalankan ketika operasi ini selesai. Antrian mungkin sudah memiliki banyak operasi di dalamnya. Operasi di depan antrian diproses dan dihapus dari antrian. Setelah operasi untuk permintaan basis data diproses, permintaan dikirim ke basis data dan ketika selesai, panggilan balik akan dieksekusi setelah selesai. Pada saat ini, prosesor antrian yang telah "menangani" operasi bergerak pada operasi berikutnya - dalam hal ini
Permintaan basis data masih diproses, tetapi operasi console.log ada di depan antrian dan diproses. Ini menjadi operasi yang sinkron dijalankan segera menghasilkan output "Hello World". Beberapa waktu kemudian, operasi database selesai, hanya kemudian panggilan balik yang terdaftar dengan permintaan dipanggil dan diproses, mengatur nilai hasil variabel ke baris.
Ada kemungkinan bahwa satu operasi asinkron akan menghasilkan operasi asinkron lain, operasi kedua ini akan dimasukkan ke dalam antrian dan ketika sampai di depan antrian akan diproses. Memanggil panggilan balik yang terdaftar dengan operasi asinkron adalah cara JavaScript run time mengembalikan hasil operasi ketika selesai.
Metode sederhana untuk mengetahui operasi JavaScript mana yang tidak sinkron adalah untuk mencatat jika membutuhkan panggilan balik - panggilan balik adalah kode yang akan dieksekusi ketika operasi pertama selesai. Dalam dua contoh dalam pertanyaan, kita hanya dapat melihat kasus kedua memiliki panggilan balik, jadi ini adalah operasi asinkron dari keduanya. Ini tidak selalu terjadi karena berbagai gaya penanganan hasil operasi asinkron.
Untuk mempelajari lebih lanjut, baca tentang janji. Janji adalah cara lain di mana hasil dari operasi asinkron dapat ditangani. Yang menyenangkan tentang janji adalah bahwa gaya pengkodean terasa lebih seperti kode sinkron.
Banyak perpustakaan seperti simpul 'fs', menyediakan gaya sinkron dan asinkron untuk beberapa operasi. Dalam kasus di mana operasi tidak memakan waktu lama dan tidak banyak digunakan - seperti dalam kasus membaca file konfigurasi - operasi gaya sinkron akan menghasilkan kode yang lebih mudah dibaca.
sumber
Dalam kasus sinkron, perintah console.log tidak dieksekusi sampai permintaan SQL selesai dieksekusi.
Dalam kasus asinkron, perintah console.log akan langsung dieksekusi. Hasil kueri kemudian akan disimpan oleh fungsi "callback" beberapa saat setelahnya.
sumber
Perbedaan utama adalah dengan pemrograman asinkron, Anda tidak menghentikan eksekusi sebaliknya. Anda dapat terus mengeksekusi kode lain saat 'permintaan' sedang dibuat.
sumber
Fungsi ini membuat yang kedua tidak sinkron.
Yang pertama memaksa program untuk menunggu setiap baris untuk menyelesaikannya berjalan sebelum yang berikutnya dapat melanjutkan. Yang kedua memungkinkan setiap baris untuk berjalan bersama (dan secara mandiri) sekaligus.
Bahasa dan kerangka kerja (js, node.js) yang memungkinkan asinkron atau konkurensi sangat bagus untuk hal-hal yang memerlukan transmisi waktu nyata (mis. Obrolan, aplikasi stok).
sumber
Sinkronisasi Pemrograman
Bahasa pemrograman seperti C, C #, Java adalah program sinkronisasi, apa pun yang Anda tulis akan dieksekusi dalam urutan tulisan Anda.
Async
NodeJs hadir dengan fitur async, sifatnya non-blocking, misalkan dalam tugas I / O yang membutuhkan waktu (mengambil, menulis, membaca), nodejs tidak akan diam dan menunggu tugas selesai, itu ' Saya akan mulai menjalankan tugas-tugas berikutnya dalam antrian, dan setiap kali tugas yang diselesaikan selesai, akan diberitahukan menggunakan panggilan balik. Contoh berikut akan membantu:
Singkatnya, Output adalah sebagai:
Perbedaannya jelas di mana sinkronisasi pasti akan membutuhkan lebih dari 600 (500 + 100 + waktu pemrosesan) msec, async menghemat waktu.
sumber
Fungsi sinkron memblokir sedangkan fungsi asinkron tidak. Dalam fungsi sinkron, pernyataan lengkap sebelum pernyataan berikutnya dijalankan. Dalam hal ini, program dievaluasi sesuai urutan pernyataan dan pelaksanaan program dijeda jika salah satu pernyataan memakan waktu sangat lama.
Fungsi asinkron biasanya menerima panggilan balik sebagai parameter dan eksekusi dilanjutkan pada baris berikutnya segera setelah fungsi asinkron dipanggil. Callback hanya dipanggil ketika operasi asinkron selesai dan tumpukan panggilan kosong. Operasi tugas berat seperti memuat data dari server web atau meminta basis data harus dilakukan secara tidak serempak sehingga utas utama dapat terus menjalankan operasi lain alih-alih memblokir hingga operasi yang lama selesai (dalam hal browser, UI akan membeku) .
Orginal Diposting di Github: Tautan
sumber
Pemrograman asinkron dalam JS:
Sinkronis
Tidak sinkron
Contoh:
sumber