Seperti yang kita ketahui socket.send() tidak menjamin semua data terkirim
dan baris ini:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L165
dikombinasikan dengan gevent dan teknologi skala web terbesar, yang dikenal sebagai buruh pelabuhan telah membawa saya ke perilaku itu dengan tanggapan yang terpotong :3
Sepertinya socket.SocketIO harus peduli tentang itu, tetapi tidak
Meskipun Anda mungkin benar (belum melakukan penelitian apa pun), harap perhatikan bahwa server Werkzeug hanya ditujukan untuk pengembangan. Menjalankannya di Docker dan dengan gevent membuat saya percaya bahwa Anda tidak menggunakannya untuk tujuan itu.
Saya sebenarnya menggunakan buruh pelabuhan untuk pengembangan dan bagian dari kode menggunakan gevent monkeypatches dengan cukup sembrono.
Saya mungkin tidak akan menyadarinya jika tidak pecah jangan panik :3
Saya telah mengalami bug ini di Python 3.5, tetapi hanya ketika mengatur soket yang mendasarinya ke mode non-blocking (misalnya dengan settimeout
). Ternyata ini sebenarnya disebabkan oleh bug upstream di Python 3: issue24291 . Masalah ini diperbaiki dengan Python 3.6 (lihat issue26721 )
Solusi yang telah diterapkan di server web lain adalah dengan membungkus wfile
dalam io.BufferedWriter
(misalnya dalam wsgiref CPython di 3.5 ) atau mengubah wbufsize
untuk mengaktifkan buffering dengan default (misalnya lihat masalah gevent ini )
Tidak yakin apakah werkzeug ingin mengimplementasikan solusi juga, atau menganggapnya sebagai masalah non-werkzeug.
berdasarkan informasi yang diberikan saya yakin ini memang bug gevent atau bug stdlib, werkzeug menggunakan write + flush pada file yang seharusnya buffer, yang pada gilirannya harus selalu berfungsi, sekarang saya ingin tahu apakah ini juga terjadi pada python biasa, atau hanya pada gevent
@RonnyPfannschmidt ya, saya mendapatkannya tanpa gevent
juga, saya hanya perlu menggunakan non-blocking socket dalam kombinasi dengan werkzeug WSGIRequestHandler
. Gevent hanyalah contoh lain dari banyak proyek yang secara tidak langsung dipengaruhi oleh bug upstream di Python 3.5 :-)
Mengingat keadaan ini terjadi, serta fakta bahwa itu diperbaiki di Python 3.5 (3.4 berjalan EOL pada bulan Maret), saya menutup ini.
Komentar yang paling membantu
Saya telah mengalami bug ini di Python 3.5, tetapi hanya ketika mengatur soket yang mendasarinya ke mode non-blocking (misalnya dengan
settimeout
). Ternyata ini sebenarnya disebabkan oleh bug upstream di Python 3: issue24291 . Masalah ini diperbaiki dengan Python 3.6 (lihat issue26721 )Solusi yang telah diterapkan di server web lain adalah dengan membungkus
wfile
dalamio.BufferedWriter
(misalnya dalam wsgiref CPython di 3.5 ) atau mengubahwbufsize
untuk mengaktifkan buffering dengan default (misalnya lihat masalah gevent ini )Tidak yakin apakah werkzeug ingin mengimplementasikan solusi juga, atau menganggapnya sebagai masalah non-werkzeug.