[Python-ideas] An alternate approach to async IO

Trent Nelson trent at snakebite.org
Wed Nov 28 01:01:34 CET 2012


On Tue, Nov 27, 2012 at 03:50:18PM -0800, Sturla Molden wrote:
> 
> Den 27. nov. 2012 kl. 18:49 skrev Trent Nelson <trent at snakebite.org>:
> 
> >     
> >    Here's the "idea" I had, with zero working code to back it up:
> >    what if we had a bunch of threads in the background whose sole
> >    purpose it was to handle AIO?  On Windows/AIX, they would poll
> >    GetQueuedCompletionStatus, on Solaris, get_event().
> > 
> >    They're literally raw pthreads and have absolutely nothing to do
> >    with Python's threading.Thread() stuff.  They exist solely in C
> >    and can't be interfaced to directly from Python code.
> > 
> >    ....which means they're free to run outside the GIL, and thus,
> >    multiple cores could be leveraged concurrently.  (Only for
> >    processing completed I/O, but hey, it's better than nothing.)
> 
> 
> And herein lies the misunderstanding. 
> 
> A Python thread can do the same processing of completed I/O before it
> reacquires the GIL – and thus Python can run on multiple cores
> concurrently. There is no difference between a pthread and a
> threading.Thread that has released the GIL. You don't need to spawn a
> pthread to process data independent if the GIL. You just need to
> process the data before the GIL is reacquired.
> 
> In fact, I use Python threads for parallel computing all the time.
> They scale as well as OpenMP threads on multiple cores. Why? Because I
> have made sure the computational kernels (e.g. LAPACK functions)
> releases the GIL before they execute – and the GIL is not reacquired
> before they are done. As long as the threads are running in C or
> Fortran land they don't need the GIL. I don't need to spawn pthreads
> or use OpenMP pragmas to create threads that can run freely on all
> cores. Python threads (threading.Thread) can do that too.

    Perhaps I was a little too eager to highlight the ability for these
    background IO threads to run without needing to acquire the GIL.
    A Python thread could indeed do the same job, however, you still
    wouldn't interact with it from Python code as if it were a normal
    threading.Thread.

        Trent.



More information about the Python-ideas mailing list