众所周知,socket.send() 并不能保证所有数据都被发送
这行:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L165
结合 gevent 和最伟大的网络规模技术(称为 docker),我发现了这种行为,响应被截断:3
似乎 socket.SocketIO 应该关心它,但它并不关心
虽然您可能是正确的(尚未进行任何研究),但请注意 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),我将关闭它。
最有用的评论
我在 Python 3.5 中遇到过这个错误,但仅在将底层套接字设置为非阻塞模式时(例如使用
settimeout
)。 事实证明,这实际上是由 Python 3 中的上游错误引起的: issue24291 。 该问题已在 Python 3.6 中修复(请参阅issue26721 )已在其他 Web 服务器中实现的解决方法是将
wfile
io.BufferedWriter
中(例如,在 3.5 中的 CPython wsgiref 中)或更改wbufsize
以启用缓冲默认(例如看到这个 gevent 问题)不确定 werkzeug 是否也想实施解决方法,或者认为这是一个非 werkzeug 问题。