Werkzeug: Asumsi yang salah dalam werkzeug.serving tentang perilaku soket

Dibuat pada 1 Mei 2016  ·  6Komentar  ·  Sumber: pallets/werkzeug

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

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 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.

Semua 6 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

caiz picture caiz  ·  3Komentar

SimonSapin picture SimonSapin  ·  12Komentar

lepture picture lepture  ·  6Komentar

mhelmetag picture mhelmetag  ·  8Komentar

KangOl picture KangOl  ·  16Komentar