You are basically right with your assumptions. A task will only block if the disk is actually slower than the network. However, if this happens, it might block for the complete data in the worst case (I tried piping a file from an USB stick to localhost, where 400MB were transferred during one blocking call with 20 MB/s).

So, what I would additionally propose is a configurable limit on how much data is attempted to be transferred in one blocking call. That's also what nginx seems to do with its [`sendfile_max_chunk`](http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile_max_chunk) parameter.