Baru mulai bermain-main dengan Flask di server lokal dan saya perhatikan waktu request / response jauh lebih lambat dari yang saya rasa seharusnya.
Hanya server sederhana seperti berikut ini membutuhkan waktu hampir 5 detik untuk merespons.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
Ada ide? Atau apakah ini hanya bagaimana server lokal?
Jawaban:
Ok saya menemukan jawabannya. Tampaknya ada masalah dengan Werkzeug dan os yang mendukung ipv6.
Dari situs Werkzeug http://werkzeug.pocoo.org/docs/serving/ :
Jadi perbaikannya adalah menonaktifkan ipv6 dari localhost dengan mengomentari baris berikut dari file host saya:
::1 localhost
Setelah saya melakukan ini, masalah latensi akan hilang.
Saya benar-benar menggali Flask dan saya senang tidak ada masalah dengan kerangka kerjanya. Saya tahu itu tidak mungkin.
sumber
Tambahkan "threaded = True" sebagai argumen ke app.run (), seperti yang disarankan di sini: http://arusahni.net/blog/2013/10/flask-multithreading.html
Sebagai contoh:
app.run(host="0.0.0.0", port=8080, threaded=True)
Solusi penonaktifan ipv6 tidak berhasil untuk saya, tetapi ini berhasil.
sumber
--threaded
saya juga berhasil.manage.py
Flask-Script
flask run --with-threads
yang memecahkan masalah saya.Solusi dari @ sajid-siddiqi secara teknis benar, tetapi perlu diingat bahwa server WSGI built-in di Werkzeug (yang dikemas ke dalam Flask dan untuk apa
app.run()
) hanya single-threaded.Instal server WSGI agar dapat menangani perilaku multi-threaded. Saya melakukan banyak penelitian tentang berbagai kinerja server WSGI . Kebutuhan Anda mungkin berbeda, tetapi jika yang Anda gunakan hanyalah Flask , maka saya akan merekomendasikan salah satu server web berikut.
Pembaruan (2020-07-25): Sepertinya gevent mulai mendukung python3 5 tahun yang lalu, tak lama setelah saya berkomentar bahwa itu tidak, jadi Anda dapat menggunakan gevent sekarang.
gevent
Anda dapat menginstal gevent melalui pip dengan perintah
pip install gevent
atau pip3 dengan perintahpip3 install gevent
. Petunjuk tentang cara mengubah kode Anda ada di sini: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#geventmeinheld
gevent lebih baik, tetapi dari semua tolok ukur yang saya lihat yang melibatkan pengujian dunia nyata, meinheld tampaknya menjadi server WSGI yang paling lugas dan sederhana . (Anda juga dapat melihat uWSGI jika Anda tidak keberatan dengan konfigurasi lainnya.)
Anda juga dapat menginstal meinheld melalui pip3 dengan perintah
pip3 install meinheld
. Dari sana, lihat contoh yang disediakan di sumber meinheld untuk mengintegrasikan Flask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* CATATAN: Dari penggunaan PyCharm saya , garis
from meinheld import server
disorot sebagai kesalahan, tetapi server akan berjalan, sehingga Anda dapat mengabaikan kesalahan tersebut.sumber
Bukan memanggil
http://localhost:port/endpoint
panggilanhttp://127.0.0.1:port/endpoint
. Ini menghapus penundaan awal 500ms untuk saya.sumber
Masalah saya diselesaikan dengan "threaded = True", tetapi saya ingin memberikan beberapa latar belakang untuk membedakan masalah saya dari masalah lain yang mungkin tidak dapat dilakukan ini.
Tebakan terbaik saya adalah bahwa Chrome mencoba untuk membuat sesi tetap terbuka dan Flask memblokir permintaan berikutnya. Segera setelah koneksi dari Chrome dihentikan atau disetel ulang, yang lainnya diproses.
Dalam kasus saya, threading memperbaikinya. Tentu saja, saya sekarang akan menelusuri beberapa tautan yang telah disediakan orang lain untuk memastikan bahwa itu tidak akan menyebabkan masalah lain.
sumber
threaded=True
berfungsi untuk saya, tetapi akhirnya saya menemukan bahwa masalahnya adalah karena foxyproxy di firefox. Sejak saat aplikasi flask dijalankan di localhost, respon lambat terjadi jikarespon lambat tidak akan terjadi jika
foxyproxy dinonaktifkan di firefox
mengakses situs web menggunakan browser lain
Satu-satunya solusi yang saya temukan adalah menonaktifkan foxyproxy, mencoba menambahkan localhost ke daftar hitam proxy dan mengubah pengaturan tetapi tidak ada yang berfungsi.
sumber
Saya menggunakan tanggapan Miheko untuk menyelesaikan masalah saya.
::1 localhost
sudah dikomentari di file host saya, dan pengaturanThreaded=true
tidak berfungsi untuk saya. Setiap permintaan REST membutuhkan waktu 1 detik untuk diproses, bukan instan.Saya menggunakan python 3.6, dan saya mendapatkan flask untuk menjadi cepat dan responsif terhadap permintaan REST dengan membuat flask menggunakan gevent sebagai WSGI-nya.
Untuk menggunakan gevent, instal dengan
pip install gevent
Setelah itu, saya menggunakan https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 untuk mengatur flask agar menggunakan gevent.
Jika tautan turun, inilah bagian penting dari skrip:
from flask import Flask, Response from gevent.pywsgi import WSGIServer from gevent import monkey # need to patch sockets to make requests async # you may also need to call this before importing other packages that setup ssl monkey.patch_all() app = Flask(__name__) # define some REST endpoints... def main(): # use gevent WSGI server instead of the Flask # instead of 5000, you can define whatever port you want. http = WSGIServer(('', 5000), app.wsgi_app) # Serve your application http.serve_forever() if __name__ == '__main__': main()
sumber
Saya mendapat kesalahan ini saat menjalankan host selain
localhost
juga, jadi untuk beberapa, masalah mendasar yang berbeda mungkin menunjukkan gejala yang sama.Saya mengganti sebagian besar hal yang telah saya gunakan ke Tornado, dan secara anekdot itu sangat membantu. Saya mengalami beberapa pemuatan halaman yang lambat, tetapi semuanya tampak lebih responsif. Juga, sangat anekdot, tapi saya melihat bahwa Flask sendiri akan melambat seiring waktu, tapi Flask + Tornado kurang begitu. Saya membayangkan menggunakan Apache dan
mod_wsgi
akan membuat segalanya menjadi lebih baik, tetapi Tornado sangat mudah disiapkan (lihat http://flask.pocoo.org/docs/deploying/others/ ).(Juga, pertanyaan terkait: aplikasi Flask terkadang hang )
sumber
Saya punya solusi berbeda di sini. Saya baru saja menghapus semua
.pyc
dari direktori server dan memulainya lagi. Ngomong-ngomong, localhost sudah diberi komentar di file host saya (Windows 8).Server membeku sepanjang waktu dan sekarang berfungsi dengan baik lagi.
sumber