[Python-Dev] httplib &c. timeouts and global state
John J Lee
jjl at pobox.com
Sat Mar 22 03:40:00 CET 2008
http://python.org/sf/2451
"""
The new timeout support in 2.6 makes use of new function
socket.create_connection(). socket.create_connection() provides no way
to disable timeouts, other than by relying on socket.getdefaulttimeout()
returning None. This is unfortunate, because it was the purpose of the
new timeout support to allow control of timeouts without reliance on
global state.
setdefaultsocket.create_connection() should always call
sock.settimeout() with the timeout passed to create_connection(), unless
a special non-None value is passed indicating that the global default is
to be used. Specific modules may then use that special non-None value
where required, to preserve backwards-compatibility.
"""
Facundo doesn't seem to agree. If I understand him correctly, he objects
to the use of a special value other than None as an argument value. I
think avoiding this minor complication is secondary to avoiding
gratuitously imposing global state on users where it's not needed.
Much existing code uses .setdefaulttimeout(), because legacy code does not
expose the socket timeout. Of course, not all of that code can be changed
immediately (otherwise, why did we wait so long before Facundo did his
valuable work on this?). Of course, very often, code that calls
socket.setdefaulttimeout(some_non_none_value) wants a default timeout for
everything. But that isn't *always* the case, and standard library
modules that expose the timeout feature should not make that assumption.
For example, an application might only want to set a timeout for some
non-essential network operation. As another example, useful but
poorly-written library code might call .setdefaulttimeout(). Also, ISTM
there's a big difference between nobody having contributed the time to
implement the feature on the one hand, and deliberately imposing the
global socket timeout state on users on the other!
Facundo indicates in the tracker discussion for 2451 that a decision was
made here about this, but doesn't recall exactly which post, and directed
me here. What I found in the archive is this thread (sorry for the
non-python.org URL):
http://www.gossamer-threads.com/lists/python/dev/555039?do=post_view_threaded#555039
In that discussion, this issue is raised, but I don't see any resolution
that answers the objection made in issue 2451. Anyway, apologies in
advance if there was a decision here that takes account of the above
objection.
I do want to thank Facundo for adding the timeout support to modules such
as httplib. But I also want to loudly complain about this detail :-)
John
More information about the Python-Dev
mailing list