Python Tornado max_buffer_size 所有请求
Python Tornado max_buffer_size across all requests
我知道我可以在Tornado中设置max_buffer_size
来限制可以上传到服务器的数据量。但我想做的是限制 所有 请求到我的 Tornado 服务器的数据总量。
例如,我同时有 500 个请求发送到我的 Tornado 服务器。每个请求上传 1MB 的数据。我希望我的 Tornado 服务器在所有请求中收到超过 150MB 的数据时拒绝连接。所以前 150 个请求将被接收,但接下来的 350 个请求将被 Tornado 拒绝,然后再将任何数据缓冲到内存中。
是否可以在 Tornado 中执行此操作?
目前没有办法像这样设置全局限制(但添加它可能是件好事)。
你目前能做的最好的事情是确保每个连接使用的内存保持较低:设置一个较低的默认值 max_body_size
,对于需要接收更多数据的 RequestHandlers,使用 @stream_request_body
并在 prepare()
中调用 self.request.connection.set_max_body_size(large_value)
。使用 @stream_request_body
装饰器,每个连接的内存使用将受到 chunk_size
参数的限制,而不是一次读取整个主体。然后在您的 data_recieved
方法中,您可以 await
从全局信号量进行分配以控制超出每个连接块大小的内存使用。
我知道我可以在Tornado中设置max_buffer_size
来限制可以上传到服务器的数据量。但我想做的是限制 所有 请求到我的 Tornado 服务器的数据总量。
例如,我同时有 500 个请求发送到我的 Tornado 服务器。每个请求上传 1MB 的数据。我希望我的 Tornado 服务器在所有请求中收到超过 150MB 的数据时拒绝连接。所以前 150 个请求将被接收,但接下来的 350 个请求将被 Tornado 拒绝,然后再将任何数据缓冲到内存中。
是否可以在 Tornado 中执行此操作?
目前没有办法像这样设置全局限制(但添加它可能是件好事)。
你目前能做的最好的事情是确保每个连接使用的内存保持较低:设置一个较低的默认值 max_body_size
,对于需要接收更多数据的 RequestHandlers,使用 @stream_request_body
并在 prepare()
中调用 self.request.connection.set_max_body_size(large_value)
。使用 @stream_request_body
装饰器,每个连接的内存使用将受到 chunk_size
参数的限制,而不是一次读取整个主体。然后在您的 data_recieved
方法中,您可以 await
从全局信号量进行分配以控制超出每个连接块大小的内存使用。