Repository URL to install this package:
Version:
3.3.29 ▾
|
ó EYc @ sm d Z d d l m Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d d d d d g Z e Z e j j j Z e j j j Z d e f d YZ d e f d YZ d e f d YZ d e f d YZ d e f d YZ d e f d YZ d S( sÌ Synchronized queues. The :mod:`eventlet.queue` module implements multi-producer, multi-consumer queues that work across greenlets, with the API similar to the classes found in the standard :mod:`Queue` and :class:`multiprocessing <multiprocessing.Queue>` modules. A major difference is that queues in this module operate as channels when initialized with *maxsize* of zero. In such case, both :meth:`Queue.empty` and :meth:`Queue.full` return ``True`` and :meth:`Queue.put` always blocks until a call to :meth:`Queue.get` retrieves the item. An interesting difference, made possible because of greenthreads, is that :meth:`Queue.qsize`, :meth:`Queue.empty`, and :meth:`Queue.full` *can* be used as indicators of whether the subsequent :meth:`Queue.get` or :meth:`Queue.put` will not block. The new methods :meth:`Queue.getting` and :meth:`Queue.putting` report on the number of greenthreads blocking in :meth:`put <Queue.put>` or :meth:`get <Queue.get>` respectively. iÿÿÿÿ( t print_functionN( t Event( t getcurrent( t get_hub( t six( t queue( t Timeoutt Queuet PriorityQueuet LifoQueuet LightQueuet Fullt Emptyt Waiterc B sn e Z d Z d g Z d Z d Z d Z d Z e Z e d Z d d Z d Z d Z RS( s6 A low level synchronization class. Wrapper around greenlet's ``switch()`` and ``throw()`` calls that makes them safe: * switching will occur only if the waiting greenlet is executing :meth:`wait` method currently. Otherwise, :meth:`switch` and :meth:`throw` are no-ops. * any error raised in the greenlet is handled inside :meth:`switch` and :meth:`throw` The :meth:`switch` and :meth:`throw` methods must only be called from the :class:`Hub` greenlet. The :meth:`wait` method must be called from a greenlet other than :class:`Hub`. t greenletc C s d | _ d S( N( t NoneR ( t self( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt __init__N s c C sD | j r d } n d } d t | j t t | | | j f S( Ns waitingt s <%s at %s%s greenlet=%r>( t waitingt typet __name__t hext idR ( R R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt __repr__Q s c C s5 | j r d } n d } d t | j | | j f S( sD >>> print(Waiter()) <Waiter greenlet=None> s waitingR s <%s%s greenlet=%s>( R R R R ( R R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt __str__Z s c C s | j d k S( N( R R ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt __nonzero__e s c C s | j d k S( N( R R ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR j s c C s_ t t j k s! t d | j d k r[ y | j j | Wq[ t j q[ Xn d S( s Wake up the greenlet that is calling wait() currently (if there is one). Can only be called from Hub's greenlet. s3 Can only use Waiter.switch method from the mainloopN( R R R t AssertionErrorR t switcht tracebackt print_exc( R t value( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR n s c G s_ t t j k s! t d | j d k r[ y | j j | Wq[ t j q[ Xn d S( su Make greenlet calling wait() wake up (if there is a wait()). Can only be called from Hub's greenlet. s3 Can only use Waiter.switch method from the mainloopN( R R R R R t throwR R ( R t throw_args( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR z s c C sS | j d k s% t d | j f t | _ z t j SWd d | _ Xd S( s2 Wait until switch() or throw() is called. s! This Waiter is already used by %rN( R R R R R R ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt wait s %N( R t __module__t __doc__t __slots__R R R R t __bool__t propertyR R R R R" ( ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR @ s c B sÈ e Z d Z d d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z e d d Z d Z e d d Z d Z d Z d Z RS( s This is a variant of Queue that behaves mostly like the standard :class:`Stdlib_Queue`. It differs by not supporting the :meth:`task_done <Stdlib_Queue.task_done>` or :meth:`join <Stdlib_Queue.join>` methods, and is a little faster for not having that overhead. c C s_ | d k s | d k r$ d | _ n | | _ t | _ t | _ d | _ | j | d S( Ni ( R t maxsizet sett getterst putterst _event_unlockt _init( R R( ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR s c C s t j | _ d S( N( t collectionst dequeR ( R R( ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR- § s c C s | j j S( N( R t popleft( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt _getª s c C s | j j | d S( N( R t append( R t item( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt _put s c C s, d t | j t t | | j f S( Ns <%s at %s %s>( R R R R t _format( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR ° s c C s d t | j | j f S( Ns <%s %s>( R R R5 ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR ³ s c C s d | j f } t | d d r6 | d | j 7} n | j rY | d t | j 7} n | j r| | d t | j 7} n | j d k r | d 7} n | S( Ns maxsize=%rR s queue=%rs getters[%s]s putters[%s]s unlocking( R( t getattrR R R* t lenR+ R, ( R t result( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR5 ¶ s c C s t | j S( s Return the size of the queue.( R7 R ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt qsize s c C sD | j d k r7 | d k s* | | j k r7 | j n | | _ d S( sy Resizes the queue's maximum size. If the size is increased, and there are putters waiting, they may be woken up.N( R( R t _schedule_unlock( R t size( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt resizeÆ s * c C s t | j S( s` Returns the number of greenthreads that are blocked waiting to put items into the queue.( R7 R+ ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt puttingÐ s c C s t | j S( sV Returns the number of greenthreads that are blocked waiting on an empty queue.( R7 R* ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt gettingÕ s c C s | j S( s; Return ``True`` if the queue is empty, ``False`` otherwise.( R9 ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt emptyÚ s c C s" | j d k o! | j | j k S( sk Return ``True`` if the queue is full, ``False`` otherwise. ``Queue(None)`` is never full. N( R( R R9 ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt fullÞ s c C s~ | j d k s$ | j | j k rJ | j | | j rz| j qzn0| r¾ t j t k r¾ xL | j r´ | j j } | ri | j | | j } | j | d Sqi Wt n¼ | rtt | } | j j | t | t } zd | j r| j n | j } | | k s3t d | f | j t k rR| j | n Wd | j | j j | Xn t d S( s# Put an item into the queue. If optional arg *block* is true and *timeout* is ``None`` (the default), block if necessary until a free slot is available. If *timeout* is a positive number, it blocks at most *timeout* seconds and raises the :class:`Full` exception if no free slot was available within that time. Otherwise (*block* is false), put an item on the queue if a free slot is immediately available, else raise the :class:`Full` exception (*timeout* is ignored in that case). Ns! Invalid switch into Queue.put: %r( R( R R9 R4 R* R: R R R t popR1 R R t ItemWaiterR+ t addR R" R R3 t _NONEt cancelt discard( R R3 t blockt timeoutt gettert waiterR8 ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt putæ s6 $ c C s | j | t d S( s² Put an item into the queue without blocking. Only enqueue the item if a free slot is immediately available. Otherwise raise the :class:`Full` exception. N( RK t False( R R3 ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt put_nowait s c C s | j r, | j r" | j n | j S| r t j t k r xH | j r | j j } | rK | j | | j r | j SqK qK Wt ny | rt } t | t } z4 | j j | | j rã | j n | j SWd | j j | | j Xn t d S( s Remove and return an item from the queue. If optional args *block* is true and *timeout* is ``None`` (the default), block if necessary until an item is available. If *timeout* is a positive number, it blocks at most *timeout* seconds and raises the :class:`Empty` exception if no item was available within that time. Otherwise (*block* is false), return an item if one is immediately available, else raise the :class:`Empty` exception (*timeout* is ignored in that case). N( R9 R+ R: R1 R R R RA R R R R R* RC R" RF RE ( R RG RH t putterRJ ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt get s. c C s | j t S( s´ Remove and return an item from the queue without blocking. Only get an item if one is immediately available. Otherwise raise the :class:`Empty` exception. ( RO RL ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt get_nowait@ s c C s| zkxdt ri| j rv | j rv | j j } | rfy | j } Wn | j t j qs X| j | qfq | j r| j r| j j } | rf| j j } | rú | j } t | _ | j | | j } | j | | j | q | j j | qfq | j re| j sF| j d k sF| j | j k re| j j } | j | q Pq WWd d | _ Xd S( N( t TrueR9 R* RA R1 R t syst exc_infoR R+ R3 RD R4 RC R( R R, ( R RI R3 RN ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyt _unlockH s: c C s1 | j d k r- t j d | j | _ n d S( Ni ( R, R R t schedule_call_globalRT ( R ( ( sC /home/tvault/.virtenv/lib/python2.7/site-packages/eventlet/queue.pyR: o s N( R R# R$ R R R- R1 R4 R R R5 R9 R<