diff options
author | Nir Soffer <nirsof@gmail.com> | 2017-11-06 21:16:37 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2017-11-06 21:16:37 (GMT) |
commit | ad455cd9243319b896c86074ffeb3bf78a82f4ec (patch) | |
tree | 48a4989023b45958c9fa7dfe090936506998906d /Doc | |
parent | 30f4fa456ef626ad7a92759f492ec7a268f7af4e (diff) | |
download | cpython-ad455cd9243319b896c86074ffeb3bf78a82f4ec.zip cpython-ad455cd9243319b896c86074ffeb3bf78a82f4ec.tar.gz cpython-ad455cd9243319b896c86074ffeb3bf78a82f4ec.tar.bz2 |
bpo-31945: Configurable blocksize in HTTP(S)Connection (#4279)
blocksize was hardcoded to 8192, preventing efficient upload when using
file-like body. Add blocksize argument to __init__, so users can
configure the blocksize to fit their needs.
I tested this uploading data from /dev/zero to a web server dropping the
received data, to test the overhead of the HTTPConnection.send() with a
file-like object.
Here is an example 10g upload with the default buffer size (8192):
$ time ~/src/cpython/release/python upload-httplib.py 10 https://localhost:8000/
Uploaded 10.00g in 17.53 seconds (584.00m/s)
real 0m17.574s
user 0m8.887s
sys 0m5.971s
Same with 512k blocksize:
$ time ~/src/cpython/release/python upload-httplib.py 10 https://localhost:8000/
Uploaded 10.00g in 6.60 seconds (1551.15m/s)
real 0m6.641s
user 0m3.426s
sys 0m2.162s
In real world usage the difference will be smaller, depending on the
local and remote storage and the network.
See https://github.com/nirs/http-bench for more info.
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/library/http.client.rst | 18 | ||||
-rw-r--r-- | Doc/whatsnew/3.7.rst | 7 |
2 files changed, 23 insertions, 2 deletions
diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 53de40f..c4b7c79 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -31,7 +31,8 @@ HTTPS protocols. It is normally not used directly --- the module The module provides the following classes: -.. class:: HTTPConnection(host, port=None[, timeout], source_address=None) +.. class:: HTTPConnection(host, port=None[, timeout], source_address=None, \ + blocksize=8192) An :class:`HTTPConnection` instance represents one transaction with an HTTP server. It should be instantiated passing it a host and optional port @@ -42,6 +43,8 @@ The module provides the following classes: (if it is not given, the global default timeout setting is used). The optional *source_address* parameter may be a tuple of a (host, port) to use as the source address the HTTP connection is made from. + The optional *blocksize* parameter sets the buffer size in bytes for + sending a file-like message body. For example, the following calls all create instances that connect to the server at the same host and port:: @@ -58,11 +61,14 @@ The module provides the following classes: The *strict* parameter was removed. HTTP 0.9-style "Simple Responses" are not longer supported. + .. versionchanged:: 3.7 + *blocksize* parameter was added. + .. class:: HTTPSConnection(host, port=None, key_file=None, \ cert_file=None[, timeout], \ source_address=None, *, context=None, \ - check_hostname=None) + check_hostname=None, blocksize=8192) A subclass of :class:`HTTPConnection` that uses SSL for communication with secure servers. Default port is ``443``. If *context* is specified, it @@ -338,6 +344,14 @@ HTTPConnection Objects Close the connection to the server. + +.. attribute:: HTTPConnection.blocksize + + Buffer size in bytes for sending a file-like message body. + + .. versionadded:: 3.7 + + As an alternative to using the :meth:`request` method described above, you can also send your request step by step, by using the four functions below. diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 6c81a2c..af722be 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -276,6 +276,13 @@ README.rst is now included in the list of distutils standard READMEs and therefore included in source distributions. (Contributed by Ryan Gonzalez in :issue:`11913`.) +http.client +----------- + +Add Configurable *blocksize* to ``HTTPConnection`` and +``HTTPSConnection`` for improved upload throughput. +(Contributed by Nir Soffer in :issue:`31945`.) + http.server ----------- |