Saat menjalankan server pengembangan - yaitu apa yang Anda dapatkan dengan menjalankan app.run()
, Anda mendapatkan satu proses sinkron, yang berarti paling banyak 1 permintaan sedang diproses pada satu waktu.
Dengan menempelkan Gunicorn di depannya dalam konfigurasi default dan hanya meningkatkan jumlah --workers
, yang Anda dapatkan pada dasarnya adalah sejumlah proses (dikelola oleh Gunicorn) yang masing-masing berperilaku seperti app.run()
server pengembangan. 4 pekerja == 4 permintaan bersamaan. Ini karena Gunicorn menggunakan sync
tipe pekerja yang disertakan secara default.
Penting untuk dicatat bahwa Gunicorn juga termasuk pekerja yang tidak sinkron, yaitu eventlet
dan gevent
(dan juga tornado
, tapi itu paling baik digunakan dengan kerangka kerja Tornado, tampaknya). Dengan menentukan salah satu pekerja async ini dengan --worker-class
bendera, yang Anda dapatkan adalah Gunicorn mengelola sejumlah proses async, yang masing-masing mengelola konkurensi sendiri. Proses ini tidak menggunakan utas, melainkan coroutine. Pada dasarnya, dalam setiap proses, masih hanya 1 hal yang dapat terjadi pada satu waktu (1 utas), tetapi objek dapat 'dihentikan sementara' ketika mereka menunggu proses eksternal untuk diselesaikan (pikirkan permintaan basis data atau menunggu di jaringan I / O).
Ini berarti, jika Anda menggunakan salah satu pekerja async Gunicorn, setiap pekerja dapat menangani lebih dari satu permintaan pada satu waktu. Berapa banyak pekerja yang terbaik tergantung pada sifat aplikasi Anda, lingkungannya, perangkat keras yang digunakannya, dll. Rincian lebih lanjut dapat ditemukan di halaman desain Gunicorn dan mencatat bagaimana gevent bekerja pada halaman intro-nya.
Saat ini ada solusi yang jauh lebih sederhana daripada yang sudah disediakan. Saat menjalankan aplikasi Anda, Anda hanya harus meneruskan
threaded=True
parameter keapp.run()
panggilan, seperti:Opsi lain sesuai dengan apa yang dapat kita lihat di dokumen werkzeug , adalah menggunakan
processes
parameter, yang menerima angka> 1 yang menunjukkan jumlah maksimum proses bersamaan untuk ditangani:Sesuatu seperti:
Info lebih lanjut tentang
run()
metode di sini , dan posting blog yang mengarahkan saya untuk menemukan solusi dan referensi api.Catatan: pada dokumen Flask mengenai
run()
metode ini menunjukkan bahwa menggunakannya dalam Lingkungan Produksi tidak disarankan karena ( kutipan ): "Meskipun ringan dan mudah digunakan, server bawaan Flask tidak cocok untuk produksi karena tidak skala dengan baik . "Namun, mereka menunjuk ke halaman Opsi Penempatan mereka untuk cara yang disarankan untuk melakukan ini ketika pergi untuk produksi.
sumber
Labu akan memproses satu permintaan per utas pada saat yang sama. Jika Anda memiliki 2 proses dengan masing-masing 4 utas, itu adalah 8 permintaan bersamaan.
Labu tidak menelurkan atau mengelola utas atau proses. Itulah responsabilitas gateway WSGI (mis. Gunicorn).
sumber
Tidak - Anda pasti bisa menangani lebih dari itu.
Penting untuk diingat bahwa jauh di lubuk hati, dengan asumsi Anda menjalankan mesin inti tunggal, CPU benar-benar hanya menjalankan satu instruksi * pada satu waktu.
Yaitu, CPU hanya dapat menjalankan satu set instruksi yang sangat terbatas, dan tidak dapat menjalankan lebih dari satu instruksi per clock tick (banyak instruksi bahkan membutuhkan lebih dari 1 tick).
Oleh karena itu, sebagian besar konkurensi yang kita bicarakan dalam ilmu komputer adalah konkurensi perangkat lunak. Dengan kata lain, ada lapisan implementasi perangkat lunak yang mengabstraksi CPU tingkat bawah dari kami dan membuat kami berpikir kami menjalankan kode secara bersamaan.
"Hal-hal" ini dapat berupa proses, yang merupakan unit kode yang dijalankan secara bersamaan dalam arti bahwa setiap proses berpikir prosesnya berjalan di dunianya sendiri dengan ingatannya sendiri yang tidak dibagi.
Contoh lain adalah utas, yang merupakan unit kode di dalam proses yang memungkinkan konkurensi juga.
Alasan 4 proses pekerja Anda dapat menangani lebih dari 4 permintaan adalah bahwa mereka akan mematikan utas untuk menangani lebih banyak dan lebih banyak permintaan.
Batas permintaan aktual tergantung pada server HTTP yang dipilih, I / O, OS, perangkat keras, koneksi jaringan dll.
Semoga berhasil!
* Instruksi adalah perintah yang sangat mendasar yang dapat dijalankan CPU. contoh - tambahkan dua angka, lompat dari satu instruksi ke instruksi lainnya
sumber