[Python-ideas] asyncore: included batteries don't fit
Trent Nelson
trent at snakebite.org
Fri Oct 12 06:45:06 CEST 2012
On Thu, Oct 11, 2012 at 07:40:43AM -0700, Antoine Pitrou wrote:
> On Wed, 10 Oct 2012 20:55:23 -0400
> Trent Nelson <trent at snakebite.org> wrote:
> >
> > You could leverage this with kqueue and epoll; have similar threads
> > set up to simply process I/O independent of the GIL, using the same
> > facilities that would be used by IOCP-processing threads.
>
> Would you really win anything by doing I/O in separate threads, while
> doing normal request processing in the main thread?
If the I/O threads can run independent of the GIL, yes, definitely.
The whole premise of IOCP is that the kernel takes care of waking
one of your I/O handlers when data is ready. IOCP allows that to
happen completely independent of your application's event loop.
It really is the best way to do I/O. The Windows NT design team
got it right from the start. The AIX and Solaris implementations
are semantically equivalent to Windows, without the benefit of
automatic thread pool management (and a few other optimisations).
On Linux and BSD, you could get similar functionality by spawning
I/O threads that could also run independent of the GIL. They would
differ from the IOCP worker threads in the sense that they all have
their own little event loops around epoll/kqueue+timeout. i.e. they
have to continually ask "is there anything to do with this set of
fds", then process the results, then manage set synchronisation.
IOCP threads, on the other hand, wait for completion of something
that has already been requested. The thread body implementation is
significantly simpler, and no synchronisation primitives are needed.
> That said, the idea of a common API architected around async I/O,
> rather than non-blocking I/O, sounds interesting at least theoretically.
It's the best way to do it. There should really be a libevent-type
library (libiocp?) that leverages IOCP where possible, and fakes it
when not using a half-sync/half-async pattern with threads and epoll
or kqueue on Linux and FreeBSD, falling back to processes and poll
on everything else (NetBSD, OpenBSD and HP-UX (the former two not
having robust-enough pthread implementations, the latter not having
anything better than select or poll)).
However, given that the best IOCP implementations are a) Windows by
a huge margin, and then b) Solaris and AIX in equal, distant second
place, I can't see that happening any time soon.
(Trying to use IOCP in the reactor fashion described above for epoll
and kqueue is far more limiting than having an IOCP-oriented API
and faking it for platforms where native support isn't available.)
> Maybe all those outdated Snakebite Operating Systems are useful for
> something after all. ;-P
All the operating systems are the latest version available!
In addition, there's also a Solaris 9 and HP-UX 11iv2 box.
The hardware, on the other hand... not so new in some cases.
Trent.
More information about the Python-ideas
mailing list