socket.rcv timeout while-loop

Stephen Hansen me+list/python at ixokai.io
Thu Feb 3 13:53:01 EST 2011


On 2/3/11 10:13 AM, Dwayne Blind wrote:
> Thanks for your answer. I don't want to reset my socket. I want to apply
> the timeout to the rcv method only.

Setting the timeout does not "reset [your] socket", I don't think. And I
get that you want to only timeout recv... that's why I pointed out its a
socket method, not an argument to recv. If you don't want it to apply to
everything else, you just have to be sure to change it back after recv.

Just:
  timeout = s.gettimeout()
  s.settimeout(3)
  s.recv(1024)
  s.settimeout(timeout)

Personally, I'd prefer to do:

with timeout(s, 3):
    s.recv(1024)

That's a lot more clear, and I'd roll this context manager to accomplish it:

--- start

from contextlib import contextmanager

@contextmanager
def timeout(sock, timeout):
    old_timeout = sock.gettimeout()
    sock.settimeout(timeout)
    try:
        yield sock
    finally:
        sock.settimeout(old_timeout)

--- end

The contextmanager decorator is an easy/quick way of making a context
manager. Everything up until the yield is executed before the 'with'
block is run, and everything after the yield is executed after the
'with' block concludes.

If the with block throws an exception, it'll be catchable at the yield
point.

-- 

   Stephen Hansen
   ... Also: Ixokai
   ... Mail: me+list/python (AT) ixokai (DOT) io
   ... Blog: http://meh.ixokai.io/

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 487 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/python-list/attachments/20110203/80029777/attachment-0001.sig>


More information about the Python-list mailing list