Michael Sparks wrote: > Chris Spencer wrote: > > At one point in your code you do this: > self._socket.setblocking(0) > > This says "if we can't recieve or send data without blocking, fail rather > than succeed". One of the failure modes is to return error 11. This is > infact normally defined as: > #define EAGAIN 11 /* Try again */ > > What this means is "sorry, I couldn't do this without blocking right now, > try again very shortly!". > > Looking at your code it continually loops (in BaseConnectionHandler_recv) > receiving data - whether or not there's any data to receive: > def _recv(self): > while self.running: > try: > data = self._socket.recv(4096) > if not len(data): > time.sleep(0.1) > continue > except Exception, e: > log('Recieve failed for handler',self.address,'because of',e) > > break > > Since you never actually check to see if the socket is ready to give you > data, and you've set it non-blocking, seeing lots of EAGAIN errors is > pretty much what you'd expect to see. (Simply sleeping is not sufficient!) > > I suppose the short answer though really is this: you set the socket > non-blocking, you should therefore expect to see failures telling you > to try again, and follow their advice! :)
You're quite right. I fixed this by using select(). However, I was still having problems with open() blocking the main thread. Then I realized a slight problem: t = threading.Thread(target=self._connection_handler(h)) I changed this to: t = threading.Thread(target=self._connection_handler, args=(h,)) and now it appears to be working correctly. Thanks for your help! I truly appreciate it. Chris -- http://mail.python.org/mailman/listinfo/python-list