[Python-Dev] Fw: SocketServer and makefile() [from comp.lang.python]

Greg Stein gstein@lyra.org
Thu, 31 Aug 2000 13:04:18 -0700


On Thu, Aug 31, 2000 at 03:48:16PM -0500, Guido van Rossum wrote:
> I wrote:
>...
> > Solution? Don't use rfile for reading, but go for the socket itself. Or
> > revamp the two classes to forget about the socket once the files (wfile and
> > rfile) are created. The latter might not be possible, tho.
> 
> I was about to say that you have it backwards, and that you should
> only use rfile & wfile, when I realized that CGIHTTPServer.py needs
> this!  The subprocess needs to be able to read the rest of the socket,
> for POST requests.  So you're right.

Ooh! I hadn't considered that case. Yes: you can't transfer the contents of
a FILE's buffer to the CGI, but you can pass a file descriptor (the socket).

> Solution?  The buffer size should be an instance or class variable.
> Then SocketServer can set it to buffered by default, and CGIHTTPServer
> can set it to unbuffered.

Seems reasonable.

> > Dunno why the unbuffered reading would be slow. I'd think it would still
> > read large chunks at a time when you request it.
> 
> System call overhead?  I had the same complaint about Windows, where
> apparently winsock makes you pay more of a performance penalty than
> Unix does in the same case.

Shouldn't be. There should still be an rfile.read(1000) in that example app
(with the big transfers). That read() should be quite fast -- the buffering
should have almost no effect.

So... what is the underlying problem?

[ IOW, there are two issues: the sock vs file thing; and why rfile is so
  darn slow; I have no insights on the latter. ]

Cheers,
-g

-- 
Greg Stein, http://www.lyra.org/