Select hangs after some reads

Steve Holden steve at holdenweb.com
Wed Jun 7 23:52:26 EDT 2006


alsmeirelles at gmail.com wrote:
> Hi,
> 
> I'm building a multithreaded application and I encountered a tiny and
> annoying problem. I use a select to wait for data to be read from a
> socket, after some reads, the select simply blocks and stays that way
> until I close the connection on the other side of the socket. When the
> socket is closed on the writer end the select releases and then I get
> only empty strings from the socket.

That's to be expected: the first return of a zero-length string from 
socket.read() indicates end of file.

> My question is this: Why did it block? The reading has never ended,
> every test I make I write 50 requests (wich are strings) to the socket
> and I have read the maximum of 34 requests. I'm using winPdb to take a
> closer look on what's happening and I see the threads blocked on this
> same select. If I send anything more through the socket, the select
> releases for a thread, despite the other data that is still unread.
> 
Are you sure that the received data is presenting in block the same size 
as are being sent? There's no guarantee this will be so on a TCP socket, 
and it may be that multiple sends are being coalesced into a single 
read. The important thing to focus on is the total number of bytes sent 
and received.

> This is the select:
>  rd,w,e = select.select([self.rfd],[],[])
> 
> self.rfd is the fileno of the file object returned by the makefile
> method from the socket object.
> 
It would be simpler to use the result of the socket's .fileno() method 
directly.

> I know that's some buffer behavior that I'm missing but I don't know
> what it is.
> 
> anything is helpfull, If I'm beeing stupid you can say it.
> thanks
> 
Without being able to see all your code it's hard to say whether or not 
you are doing something daft, but you give a general impression of 
competence.

regards
  Steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC/Ltd          http://www.holdenweb.com
Love me, love my blog  http://holdenweb.blogspot.com
Recent Ramblings     http://del.icio.us/steve.holden




More information about the Python-list mailing list