Thanks Stephen. It's really nice of you. I have not understood everything though. (I have never used a context manager before.)
Here are some comments : timeout = s.gettimeout() # Is that the default timeout ? s.settimeout(3) # I guess this is a 3 second timeout s.recv(1024) s.settimeout(timeout) # You change it back ? So with a while loop, it should be : timeout = s.gettimeout() s.settimeout(3) b=time.clock() while time.clock()-b<3 : data=s.recv(1024) s.settimeout(timeout) Am I right ? Thanks again, Dwayne 2011/2/3 Stephen Hansen <me+list/pyt...@ixokai.io> > 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/ > >
-- http://mail.python.org/mailman/listinfo/python-list