Rumah  >  Artikel  >  hujung hadapan web  >  Penjelasan terperinci tentang pengaturcaraan dipacu peristiwa dalam Node.js_node.js

Penjelasan terperinci tentang pengaturcaraan dipacu peristiwa dalam Node.js_node.js

WBOY
WBOYasal
2016-05-16 16:39:371312semak imbas

Dalam model pengaturcaraan tradisional, operasi I/O adalah seperti panggilan fungsi tempatan biasa: atur cara disekat sebelum fungsi tersebut dilaksanakan dan tidak boleh terus dijalankan. Penyekatan I/O berasal dari model hirisan masa yang lebih awal Di bawah model ini, setiap proses adalah seperti orang bebas Tujuannya adalah untuk membezakan setiap orang, dan setiap orang biasanya hanya boleh melakukan satu perkara pada masa yang sama dan mesti menunggu sahaja apabila anda selesai perkara sebelumnya anda boleh memutuskan apa yang perlu dilakukan seterusnya. Tetapi model "satu pengguna, satu proses" ini yang digunakan secara meluas dalam rangkaian komputer dan Internet mempunyai skalabilitas yang lemah. Apabila menguruskan pelbagai proses, banyak memori akan digunakan, dan penukaran konteks juga akan menduduki banyak sumber Ini adalah beban yang besar pada sistem pengendalian, dan apabila bilangan proses meningkat, prestasi sistem akan menurun dengan mendadak.

Benang berbilang adalah alternatif ialah proses ringan yang berkongsi memori dengan utas lain dalam proses yang sama menunggu operasi I/O, utas lain boleh mengambil alih CPU Apabila operasi I/O selesai, utas yang menunggu sebelum ini akan dibangkitkan. Iaitu, benang yang sedang berjalan boleh diganggu dan kemudian disambung semula kemudian. Di samping itu, di bawah beberapa sistem benang boleh berjalan selari pada teras berlainan CPU berbilang teras.

Pengaturcara tidak tahu bila urutan akan dijalankan pada masa tertentu Mereka mesti berhati-hati untuk mengendalikan akses serentak kepada memori yang dikongsi Oleh itu, mereka mesti menggunakan beberapa primitif penyegerakan untuk menyegerakkan akses kepada struktur data tertentu, seperti menggunakan. kunci atau semaphore Gunakan ini untuk memaksa utas untuk dilaksanakan dalam tingkah laku dan rancangan tertentu. Aplikasi yang sangat bergantung pada keadaan dikongsi antara benang terdedah kepada masalah aneh yang sangat rawak dan sukar dicari.

Cara lain ialah menggunakan kolaborasi berbilang utas Anda bertanggungjawab untuk mengeluarkan CPU secara eksplisit dan memberi masa CPU kepada utas lain Kerana anda sendiri mengawal pelan pelaksanaan utas, anda mengurangkan keperluan untuk penyegerakan. tetapi ia juga meningkatkan kerumitan program dan kemungkinan ralat, dan tidak mengelakkan masalah multi-threading.

Apakah itu pengaturcaraan dipacu acara

Pengaturcaraan dipacu peristiwa (pengaturcaraan dipacu Evnet) ialah gaya pengaturcaraan di mana peristiwa menentukan aliran pelaksanaan program diproses oleh pengendali acara atau panggilan balik acara ialah fungsi A semasa yang dipanggil apabila a peristiwa tertentu berlaku, seperti pangkalan data mengembalikan hasil pertanyaan atau pengguna mengklik butang.

Ingat bahawa dalam model pengaturcaraan I/O penyekat tradisional, pertanyaan pangkalan data mungkin kelihatan seperti ini:

Salin kod Kod adalah seperti berikut:

result = query('SELECT * FROM posts WHERE id = 1');

buat_sesuatu_dengan(hasil);


Fungsi pertanyaan di atas akan memastikan urutan atau proses semasa dalam keadaan menunggu sehingga pangkalan data asas melengkapkan operasi pertanyaan dan kembali.

Dalam model dipacu peristiwa, pertanyaan ini akan kelihatan seperti ini:

Salin kod Kod adalah seperti berikut:

query_finished = fungsi(hasil) {

buat_sesuatu_dengan(hasil);

}

query('SELECT * FROM posts WHERE id = 1', query_finished);

Mula-mula anda mentakrifkan fungsi yang dipanggil query_finished, yang mengandungi perkara yang perlu dilakukan selepas pertanyaan selesai. Kemudian hantar fungsi ini sebagai parameter kepada fungsi pertanyaan Apabila pertanyaan dilaksanakan, query_finished akan dipanggil dan bukannya hanya mengembalikan hasil pertanyaan.

Apabila acara yang anda minati berlaku, fungsi yang anda tentukan akan dipanggil dan bukannya hanya mengembalikan nilai hasil Model pengaturcaraan ini dipanggil pengaturcaraan dipacu peristiwa atau pengaturcaraan tak segerak. Ini adalah salah satu ciri Node yang paling jelas fungsi panggil balik yang sepadan akan dipanggil.

Lapisan bawah pengaturcaraan dipacu peristiwa bergantung pada gelung peristiwa Gelung peristiwa pada asasnya ialah struktur yang secara berterusan memanggil dua fungsi: pengesanan peristiwa dan pencetus pemproses. Dalam setiap gelung, mekanisme gelung peristiwa perlu mengesan peristiwa yang telah berlaku Apabila peristiwa itu berlaku, ia mencari fungsi panggil balik yang sepadan dan memanggilnya.

Gelung peristiwa hanyalah rangkaian yang berjalan dalam proses Apabila peristiwa berlaku, pengendali acara boleh berjalan sendiri dan tidak akan diganggu, iaitu:

1. Paling banyak satu fungsi panggil balik acara boleh dijalankan pada masa tertentu
2. Mana-mana pengendali acara tidak akan terganggu semasa berlari

Dengan ini, pembangun tidak boleh bimbang lagi tentang penyegerakan benang dan pengubahsuaian serentak memori kongsi.

Rahsia yang terkenal:

Orang dalam komuniti pengaturcaraan sistem telah lama mengetahui bahawa pengaturcaraan dipacu peristiwa ialah cara terbaik untuk mencipta perkhidmatan konkurensi tinggi kerana ia tidak perlu menyimpan banyak konteks, jadi ia menjimatkan banyak memori , ia tidak mempunyai banyak suis konteks, dan ia menjimatkan banyak masa pelaksanaan.

Perlahan-lahan, konsep ini telah menembusi platform dan komuniti lain, dan beberapa pelaksanaan gelung acara terkenal telah muncul, seperti mesin Acara Ruby, AnyEvnet Perl dan Python's Twisted Selain daripada ini, terdapat banyak pelaksanaan dan bahasa lain.

Untuk membangun dengan rangka kerja ini, anda perlu mempelajari pengetahuan khusus yang berkaitan dengan rangka kerja dan perpustakaan kelas khusus rangka kerja Contohnya, apabila menggunakan Mesin Acara, untuk menikmati faedah tanpa sekatan, anda perlu mengelak daripada menggunakan perpustakaan kelas penyegerakan dan hanya boleh menggunakan perpustakaan kelas Asynchronous untuk Mesin Acara. Jika anda menggunakan mana-mana perpustakaan yang menyekat (seperti kebanyakan perpustakaan standard Ruby), pelayan anda kehilangan kebolehskalaan optimum kerana gelung acara akan sentiasa disekat, kadangkala menghalang pemprosesan acara I/O.

Node pada asalnya direka bentuk sebagai platform pelayan I/O yang tidak menyekat, jadi secara amnya, anda harus menjangkakan semua kod yang berjalan padanya tidak menyekat. Oleh kerana JavaScript sangat kecil dan ia tidak menguatkuasakan sebarang model I/O (kerana ia tidak mempunyai perpustakaan I/O standard), Node dibina dalam persekitaran yang sangat tulen tanpa sebarang isu warisan.

Bagaimana Node dan JavaScript memudahkan aplikasi tak segerak

Ryan Dahl, pengarang Node, pada mulanya menggunakan C untuk membangunkan projek ini, tetapi mendapati bahawa mengekalkan konteks panggilan fungsi adalah terlalu rumit, mengakibatkan kerumitan kod yang tinggi. Kemudian dia beralih kepada Lua, tetapi Lua sudah mempunyai beberapa perpustakaan I/O yang menyekat Mencampurkan menyekat dan tidak menyekat mungkin mengelirukan pembangun dan menghalang ramai orang daripada membina aplikasi berskala, jadi Lua juga telah ditinggalkan. Akhirnya, dia beralih kepada JavaScript dan fungsi objek peringkat pertama dalam JavaScript menjadikan JavaScript sangat sesuai untuk pengaturcaraan dipacu peristiwa. Keajaiban JavaScript adalah salah satu sebab utama mengapa Node begitu popular.

Apakah itu penutupan

Penutupan boleh difahami sebagai fungsi khas, tetapi ia boleh mewarisi dan mengakses pembolehubah dalam skop di mana ia ditakrifkan. Apabila anda menghantar fungsi panggil balik sebagai parameter kepada fungsi lain, ia akan dipanggil kemudian. dan mereka boleh diakses seperti biasa. Ciri berkuasa ini adalah teras kejayaan Node.

Contoh berikut menunjukkan cara penutupan JavaScript berfungsi dalam penyemak imbas web. Jika anda ingin mendengar acara kendiri butang, anda boleh melakukan ini:

Salin kod Kod adalah seperti berikut:

var clickCount = 0;

document.getElementById('myButton').onclick = function() {

clickCount = 1;

makluman("klik " clickCount " kali.");

};

Beginilah ia berfungsi apabila menggunakan jQuery:

Salin kod Kod adalah seperti berikut:

var clickCount = 0;

$('button#button saya').klik(fungsi() {

diklikCount ;

makluman('Klik 'Kirairaan ' kali.');

});

Dalam JavaScript, fungsi ialah objek kelas pertama, yang bermaksud anda boleh menghantar fungsi sebagai parameter kepada fungsi lain. Dalam dua contoh di atas, yang pertama memberikan fungsi kepada fungsi lain, dan yang terakhir menghantar fungsi sebagai parameter kepada fungsi lain Fungsi pengendali (fungsi panggil balik) peristiwa klik boleh mengakses setiap pembolehubah di bawah blok kod tempat fungsi ditakrifkan , dalam kes ini, ia mempunyai akses kepada pembolehubah clickCount yang ditakrifkan dalam penutupan induknya.

Pembolehubah clickCount berada dalam skop global (skop paling luar dalam JavaScript Ia menjimatkan bilangan kali pengguna mengklik butang Ia biasanya merupakan tabiat buruk untuk menyimpan pembolehubah dalam skop global kerana ia boleh bercanggah dengan mudah kod lain , anda harus meletakkan pembolehubah dalam skop tempatan di mana ia digunakan. Selalunya, hanya membalut kod dalam fungsi adalah sama dengan membuat penutupan tambahan, supaya anda boleh mengelak daripada mencemarkan persekitaran global dengan mudah, seperti ini:

Salin kod Kod adalah seperti berikut:

                 (fungsi() {

var clickCount = 0;

$('button#button saya').klik(fungsi() {

kiraan klik ;

makluman('Klik 'Kirairaan ' kali.');

                                                                                    });

             }());


Nota: Baris ketujuh kod di atas mentakrifkan fungsi dan memanggilnya dengan segera Ini ialah corak reka bentuk biasa dalam JavaScript: mencipta skop baharu dengan mencipta fungsi.

Bagaimana penutupan membantu pengaturcaraan tak segerak

Dalam model pengaturcaraan dipacu peristiwa, mula-mula tulis kod yang akan dijalankan selepas peristiwa berlaku, kemudian masukkan kod ke dalam fungsi, dan akhirnya lulus fungsi sebagai parameter kepada pemanggil, yang kemudiannya akan dipanggil oleh fungsi pemanggil.

Dalam JavaScript, fungsi bukan takrifan terpencil Ia juga akan mengingati konteks skop di mana ia diisytiharkan Mekanisme ini membenarkan fungsi JavaScript untuk mengakses konteks di mana fungsi ditakrifkan dan konteks induk .

Apabila anda menghantar fungsi panggil balik sebagai parameter kepada pemanggil, fungsi ini akan dipanggil kemudian. Walaupun skop di mana fungsi panggil balik ditakrifkan telah tamat, apabila fungsi panggil balik dipanggil, ia masih boleh mengakses semua pembolehubah dalam skop tamat dan skop induknya. Seperti contoh terakhir, fungsi panggil balik dipanggil dalam jQuery's click(), tetapi ia masih boleh mengakses pembolehubah clickCount.

Keajaiban penutupan telah ditunjukkan lebih awal dengan menghantar pembolehubah keadaan ke fungsi membolehkan anda melakukan pengaturcaraan dipacu peristiwa tanpa mengekalkan mekanisme penutupan JavaScript akan membantu anda mengekalkannya.

Ringkasan

Pengaturcaraan dipacu peristiwa ialah model pengaturcaraan yang menentukan aliran pelaksanaan program melalui pencetusan peristiwa. Pengaturcara mendaftarkan fungsi panggil balik (sering dipanggil pengendali acara) untuk acara yang mereka minati, dan sistem kemudian memanggil pengendali acara berdaftar apabila acara itu berlaku. Model pengaturcaraan ini mempunyai banyak kelebihan yang tidak dimiliki oleh model pengaturcaraan penyekat tradisional Pada masa lalu, untuk mencapai ciri yang serupa, anda perlu menggunakan pelbagai proses/pelbagai benang.

JavaScript ialah bahasa yang berkuasa kerana fungsi dan sifat penutupan objek jenis pertama menjadikannya sangat sesuai untuk pengaturcaraan dipacu peristiwa.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn