Bagaimana 'satu' IOLoop dapat menangani 10 ribu koneksi?

saya minta maaf atas pertanyaan bodoh ini, tapi saya benar-benar bingung; dan saya harap Anda akan mengoreksi saya jika ada kesalahan.

di server berbasis thread (seperti Apache), saya memahami bahwa untuk setiap klien, 'pekerja' baru akan dibuat untuk melayani semua kebutuhannya.

di event yang digerakkan (seperti Nginx dan Tornado), inilah yang menimbulkan kebingungan saya, terutama ketika ada Tidak Aman untuk Thread seperti GIL Python; dari apa yang saya pahami, ada SATU LOOP TUNGGAL yang akan menangani SEMUA permintaan klien, jadi pemahaman bodoh saya, jika ada 10.000 koneksi simultan, saya tidak mengerti bagaimana melayani SEMUA 10 ribu permintaan itu!


person Abdelouahab Pp    schedule 02.12.2012    source sumber


Jawaban (1)


Di server yang digerakkan oleh peristiwa, Anda hanya menangani koneksi (read()s dan write()s dari koneksi tertentu, sebenarnya) satu demi satu, menggunakan panggilan non-pemblokiran. Anda biasanya menggunakan beberapa panggilan ke multipleks antar koneksi (select(), poll(), ...), yang memberi tahu Anda koneksi mana yang perlu dilayani, dan Anda melayaninya secara bergantian.

person ninjalj    schedule 02.12.2012
comment
jadi mengapa kita tidak bisa menggabungkan antara server berbasis peristiwa dan berbasis thread? - person Abdelouahab Pp; 02.12.2012
comment
Kamu bisa. misalnya: Anda mungkin memiliki thread per inti CPU, di mana setiap thread digerakkan oleh peristiwa. Anda mungkin juga memiliki thread pekerja untuk menangani pembuatan halaman dinamis (PHP, JSP, ...), dan menyajikan konten statis (gambar, ...) melalui thread normal yang digerakkan oleh peristiwa. - person ninjalj; 02.12.2012
comment
masalahnya adalah Python (CPytohn) memiliki GIL, dan seperti yang dikatakan Tornado menangani koneksi 10k, jadi saya 'terkejut' itu bisa terjadi! jika koneksi simultan 10k terjadi, maka, jika suatu operasi memiliki 1 detik, saya akan dibagi menjadi 1/10k? - person Abdelouahab Pp; 02.12.2012
comment
Tergantung. Tornado mungkin dapat menangani koneksi tipikal 10k/s, namun batasan fisik masih ada: jika Anda tidak memiliki bandwidth, Anda tidak akan dapat menangani koneksi 10k/s yang meminta pengunduhan file besar. Dalam hal ini, saat melayani setiap koneksi , idealnya server Anda hanya mengirim (hati-hati: rumus dibuat saat itu juga) (bandwith*latensi maks yang diinginkan/koneksi aktif) setiap iterasi. - person ninjalj; 02.12.2012
comment
maaf tapi apa yang Anda maksud dengan bandwidth, apakah jika saya menggunakan ADSL 2Mb (Aljazair adalah yang terbaik yang bisa saya lakukan), ini nilainya? - person Abdelouahab Pp; 02.12.2012
comment
Dalam hal ini, itu adalah bandwidth keluar Anda, yang mungkin jauh lebih rendah dari itu. Server yang sibuk seharusnya memiliki lebih banyak bandwidth. - person ninjalj; 02.12.2012
comment
jadi dalam kasus saya, saya harus memikirkan masalah 1k daripada 10k :p - person Abdelouahab Pp; 02.12.2012
comment
pada pertanyaan terakhir: jika peristiwa didorong hanya membaca dan menulis beberapa koneksi tertentu, lalu apa yang dilakukan berbasis thread? - person Abdelouahab Pp; 02.12.2012