[Web-SIG] Pending modifications to PEP 333

Alan Kennedy py-web-sig at xhaus.com
Wed Sep 1 12:52:02 CEST 2004


[Phillip J. Eby]
 > I'm just about to check in a major update to the PEP, per the details
 > below.

Phillip,

Thanks for all your hard work: I think you're doing a great job, and I 
think that the WSGI initiative is the best thing ever to happen to 
python web APIs.

But I do have one problem :-(

[Phillip J. Eby]
 > I've also clarified that 'fileno()', if present, *must* be an OS file
 > descriptor, and is only relevant to servers on platforms where file
 > descriptors exist.

This will break portability across jython and IronPython, and any other 
platforms that don't have the concept of file descriptor tables: thus it 
prevents WSGI applications from returning file-like objects on these 
platforms.

The requirement, as is, can only work on platforms that use file 
descriptor tables, i.e. where every process has an array of open 
files/file-likes, where the "fileno()" is an integer index into that 
table. Granted, all *nixes, Windows, MacOS, etc, etc, all have 
per-process file descriptor tables, thus belying their C/unix heritage.

Neither jython nor ironpython have file descriptor tables. Since the 
concept of file descriptor tables is platform specific, both the JVM and 
the .Net CLR eliminated them, and modelled all file-like objects as 
specific object classes, e.g. java.io.OutputStream, 
java.nio.SelectableChannel, System.IO.*, etc. If you want to create a 
file-like object, you must use one of platform-supplied classes: there 
is no global table of such file-like objects. You can no longer pass 
around "file descriptors", i.e. indexes into a table of file objects, 
because the semantics of what you can with various file-like objects 
varies between those objects.

Some pythonistas don't like this object specialization for file-like 
objects, and prefer the *nix file descriptor approach, since it is 
comparable to python's late-binding approach to datatypes. However, lack 
of file descriptor tables is an unavoidable reality on the JVM and CLR: 
the two most widespread virtual-machines in the world.

Insisting on the "fileno()" method returning a file descriptor makes it 
impossible to return a file like object to a jython or ironpython 
implemented WSGI container.

IMHO, the correct approach is for the appplication to return an actual 
file-like object, e.g. one with a read() method, and for the 
server/framework to then map that file-like object to whatever 
high-performance byte-stream-type object is appropriate on the platform. 
On java, for example, this could be a java.nio.FileChannel. Once one of 
these had been obtained from the returned file-like object, the high 
performance FileChannel.transferTo() could then be used to transfer the 
file contents to the socket return stream.

http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

So, please can we have WSGI require the return of a file-like object, 
which the WSGI server/framework is then free to map to a 
high-performance channel in whatever way is appropriate?

The "must return a file descriptor approach" is broken.

Kind regards,

Alan.


More information about the Web-SIG mailing list