Werkzeug: werkzeug.serving 中关于套接字行为的错误假设

创建于 2016-05-01  ·  6评论  ·  资料来源: pallets/werkzeug

众所周知,socket.send() 并不能保证所有数据都被发送

这行:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L165
结合 gevent 和最伟大的网络规模技术(称为 docker),我发现了这种行为,响应被截断:3

似乎 socket.SocketIO 应该关心它,但它并不关心

最有用的评论

我在 Python 3.5 中遇到过这个错误,但仅在将底层套接字设置为非阻塞模式时(例如使用settimeout )。 事实证明,这实际上是由 Python 3 中的上游错误引起的: issue24291 。 该问题已在 Python 3.6 中修复(请参阅issue26721

已在其他 Web 服务器中实现的解决方法是将wfile io.BufferedWriter中(例如,在 3.5 中的 CPython wsgiref 中)或更改wbufsize以启用缓冲默认(例如看到这个 gevent 问题

不确定 werkzeug 是否也想实施解决方法,或者认为这是一个非 werkzeug 问题。

所有6条评论

虽然您可能是正确的(尚未进行任何研究),但请注意 Werkzeug 的服务器仅用于开发。 在 Docker 和 gevent 中运行它让我相信您不会将它用于此目的。

我实际上一直在使用 docker 进行开发,并且部分代码非常轻率地使用了 gevent monkeypatches。
如果它不会破坏 dontpanic,我可能什至不会注意到它:3

我在 Python 3.5 中遇到过这个错误,但仅在将底层套接字设置为非阻塞模式时(例如使用settimeout )。 事实证明,这实际上是由 Python 3 中的上游错误引起的: issue24291 。 该问题已在 Python 3.6 中修复(请参阅issue26721

已在其他 Web 服务器中实现的解决方法是将wfile io.BufferedWriter中(例如,在 3.5 中的 CPython wsgiref 中)或更改wbufsize以启用缓冲默认(例如看到这个 gevent 问题

不确定 werkzeug 是否也想实施解决方法,或者认为这是一个非 werkzeug 问题。

根据提供的信息,我相信这确实是 gevent 错误或 stdlib 错误,werkzeug 在假定的缓冲文件上使用 write + flush,这反过来应该总是有效,现在我想知道这是否也发生在普通 python 上,或者只发生在事件上

@RonnyPfannschmidt是的,我也没有gevent ,我只需要结合使用非阻塞套接字和 werkzeug 的WSGIRequestHandler 。 Gevent 只是间接受到 Python 3.5 中上游错误影响的许多项目的另一个例子 :-)

考虑到这种情况发生的情况,以及它在 Python 3.5 中得到修复的事实(3.4 在 3 月 EOL),我将关闭它。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

alexgurrola picture alexgurrola  ·  5评论

masklinn picture masklinn  ·  11评论

ngaya-ll picture ngaya-ll  ·  8评论

davidism picture davidism  ·  9评论

SimonSapin picture SimonSapin  ·  12评论