Werkzeug: Неверное предположение в werkzeug.serving о поведении сокета

Созданный на 1 мая 2016  ·  6Комментарии  ·  Источник: pallets/werkzeug

Как мы все знаем, socket.send() не гарантирует отправку всех данных.

и эта строка:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L165
в сочетании с gevent и величайшей технологией веб-масштабирования, известной как докер, привело меня именно к такому поведению, когда ответы усекаются :3

Кажется, что socket.SocketIO должен заботиться об этом, но это не так.

Самый полезный комментарий

Я столкнулся с этой ошибкой в ​​Python 3.5, но только при установке базового сокета в неблокирующий режим (например, с settimeout ). Оказывается, это на самом деле вызвано ошибкой восходящего потока в Python 3: issue24291 . Проблема исправлена ​​в Python 3.6 (см. issue26721 ).

Обходной путь, который был реализован на других веб-серверах, состоит в том, чтобы обернуть wfile в io.BufferedWriter (например, в wsgiref CPython в 3.5 ) или изменить wbufsize , чтобы включить буферизацию с помощью по умолчанию (например, см. этот выпуск gevent )

Не уверен, хочет ли werkzeug также реализовать обходной путь или считает это проблемой, не связанной с werkzeug.

Все 6 Комментарий

Хотя вы, вероятно, правы (не проводили никаких исследований), обратите внимание, что сервер Werkzeug предназначен только для разработки. Запуск его в Docker и с gevent заставляет меня поверить, что вы не используете его для этой цели.

На самом деле я использовал докер для разработки, и часть кода довольно легкомысленно использовала gevent monkeypatches.
Я бы, наверное, даже не заметил, если бы он не сломался dontpanic :3

Я столкнулся с этой ошибкой в ​​Python 3.5, но только при установке базового сокета в неблокирующий режим (например, с settimeout ). Оказывается, это на самом деле вызвано ошибкой восходящего потока в Python 3: issue24291 . Проблема исправлена ​​в Python 3.6 (см. issue26721 ).

Обходной путь, который был реализован на других веб-серверах, состоит в том, чтобы обернуть wfile в io.BufferedWriter (например, в wsgiref CPython в 3.5 ) или изменить wbufsize , чтобы включить буферизацию с помощью по умолчанию (например, см. этот выпуск gevent )

Не уверен, хочет ли werkzeug также реализовать обходной путь или считает это проблемой, не связанной с werkzeug.

основываясь на предоставленной информации, я считаю, что это действительно либо ошибка gevent, либо ошибка stdlib, werkzeug использует запись + сброс в предполагаемом буферизованном файле, который, в свою очередь, всегда должен работать, теперь мне интересно, происходит ли это также на обычном питоне или только на гевенте

@RonnyPfannschmidt да, я тоже получаю это без gevent , мне просто нужно использовать неблокирующий сокет в сочетании с WSGIRequestHandler werkzeug. Gevent был просто еще одним примером многих проектов, которые косвенно затронуты ошибкой основной ветки разработки в Python 3.5 :-)

Учитывая обстоятельства, в которых это происходит, а также тот факт, что это исправлено в Python 3.5 (3.4 выходит из строя в марте), я закрываю это.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

SimonSapin picture SimonSapin  ·  12Комментарии

abathur picture abathur  ·  13Комментарии

mrx23dot picture mrx23dot  ·  6Комментарии

alexgurrola picture alexgurrola  ·  5Комментарии

davidism picture davidism  ·  9Комментарии