• Tim Peters's avatar
    Bug #788520: Queue class has logic error when non-blocking · 5af0e414
    Tim Peters yazdı
    I don't agree it had a bug (see the report), so this is *not* a candidate
    for backporting, but the docs were confusing and the Queue implementation
    was old enough to vote.
    
    Rewrote put/put_nowait/get/get_nowait from scratch, to use a pair of
    Conditions (not_full and not_empty), sharing a common mutex.  The code
    is 1/4 the size now, and 6.25x easier to understand.  For blocking
    with timeout, we also get to reuse (indirectly) the tedious timeout
    code from threading.Condition.  The Full and Empty exceptions raised
    by non-blocking calls are now easy (instead of nearly impossible) to
    explain truthfully:  Full is raised if and only if the Queue truly
    is full when the non-blocking put call checks the queue size, and
    similarly for Empty versus non-blocking get.
    
    What I don't know is whether the new implementation is slower (or
    faster) than the old one.  I don't really care.  Anyone who cares
    a lot is encouraged to check that.
    5af0e414
libqueue.tex 3.45 KB