ó
ÐH/\c           @@  s7  d  d l  m 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	 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 l m Z d  d l m Z d  d l m Z d d g Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e! f d „  ƒ  YZ" e" ƒ  Z" d e! f d „  ƒ  YZ# d „  Z$ y d  d l% Z& Wn e' k
 r±n‚ Xe j( d ƒ d  d l) m* Z+ d  d l, m- Z- d  d l% m. Z/ d „  Z0 d  „  Z1 d! e! f d" „  ƒ  YZ2 d e& j3 j4 f d# „  ƒ  YZ4 d S($   i    (   t   absolute_importN(   t   ref(   t   greenlet(   t   integer_types(   t   _get_hub_noargs(   t
   getcurrent(   t   sleep(   t   _get_hub(   t   AsyncResult(   t   Greenlet(   t   GroupMappingMixin(   t	   Semaphore(   t   Lock(   t   Queue(   t   start_new_thread(   t   get_thread_identt
   ThreadPoolt   ThreadResultt   _WorkerGreenletc           B@  s   e  Z d  „  Z d „  Z RS(   c         C@  sG   t  j |  | j ƒ t ƒ  |  _ t | ƒ |  _ t |  _ t |  j	 _
 d  S(   N(   t   RawGreenlett   __init__t   _workerR   t   thread_identt   wreft   _threadpool_wreft   Truet   greenlet_tree_is_roott   parentt   greenlet_tree_is_ignored(   t   selft
   threadpool(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   $   s
    	c         C@  s    d t  |  ƒ |  j |  j ƒ  f S(   Ns/   <ThreadPoolWorker at 0x%x thread_ident=0x%x %s>(   t   idR   R   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __repr__/   s    	(   t   __name__t
   __module__R   R    (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR       s   	c           B@  s  e  Z d  Z d d „ Z d „  Z d „  Z e e e ƒ Z d „  Z	 d „  Z
 d „  Z d „  Z e e e ƒ Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d d d „ Z d „  Z d „  Z d „  Z  RS(   sÜ   
    .. note:: The method :meth:`apply_async` will always return a new
       greenlet, bypassing the threadpool entirely.
    .. caution:: Instances of this class are only true if they have
       unfinished tasks.
    c         C@  s‰   | d  k r t ƒ  } n  | |  _ d |  _ d  |  _ t j ƒ  |  _ | j j	 d t
 ƒ |  _ y |  j | ƒ Wn |  j j ƒ  ‚  n Xd  S(   Ni    R   (   t   Nonet   get_hubt   hubt   _maxsizet   managert   ost   getpidt   pidt   loopt   forkt   Falset   fork_watchert   _initt   close(   R   t   maxsizeR%   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   =   s    			c         C@  sŠ   t  | t ƒ s% t d | f ƒ ‚ n  | d k  rG t d | f ƒ ‚ n  | |  j } |  j j | 7_ | |  _ |  j ƒ  |  j j ƒ  d  S(   Ns   maxsize must be integer: %ri    s    maxsize must not be negative: %r(	   t
   isinstanceR   t	   TypeErrort
   ValueErrorR&   t
   _semaphoret   countert   adjustt   _start_notify(   R   R1   t
   difference(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _set_maxsizeK   s    	
c         C@  s   |  j  S(   N(   R&   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _get_maxsizeW   s    c      	   C@  sP   d |  j  j t |  ƒ t |  ƒ |  j |  j |  j j  j t |  j ƒ |  j j f S(   Ns8   <%s at 0x%x %s/%s/%s hub=<%s at 0x%x thread_ident=0x%s>>(   t	   __class__R!   R   t   lent   sizeR1   R%   R   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR    \   s
    		c         C@  s
   |  j  j S(   N(   t
   task_queuet   unfinished_tasks(   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __len__c   s    c         C@  s   |  j  S(   N(   t   _size(   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt	   _get_sizei   s    c         C@  s>  | d k  r" t  d | f ƒ ‚ n  | |  j k rM t  d | |  j f ƒ ‚ n  |  j rf |  j j ƒ  n  x |  j | k  r… |  j ƒ  qi W|  j j j } xv |  j | k rx- |  j | |  j	 j
 k rÖ |  j	 j d  ƒ qª Wt ƒ  |  j k rí Pn  t | ƒ t | d d ƒ } q˜ W|  j r-|  j j |  j ƒ n |  j j ƒ  d  S(   Ni    s'   Size of the pool cannot be negative: %rs7   Size of the pool cannot be bigger than maxsize: %r > %ri   gš™™™™™©?(   R4   R&   R'   t   killRB   t   _add_threadR%   R+   t   approx_timer_resolutionR?   R@   t   putR#   R   R   t   minR.   t   startt   _on_forkt   stop(   R   R>   t   delay(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt	   _set_sizel   s&    	
	c         C@  sA   d |  _  t d ƒ |  _ t ƒ  |  _ t ƒ  |  _ |  j | ƒ d  S(   Ni    i   (   RB   R   R5   R   t   _lockR   R?   R:   (   R   R1   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR/   „   s
    	c         C@  s;   t  j ƒ  } | |  j k r7 | |  _ |  j |  j ƒ n  d  S(   N(   R(   R)   R*   R/   R&   (   R   R*   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRJ   ‹   s    	c         C@  sR   t  d |  j j j ƒ } x3 |  j j d k rM t | ƒ t | d d ƒ } q Wd S(   s6   Waits until all outstanding tasks have been completed.gü©ñÒMb@?i    i   gš™™™™™©?N(   t   maxR%   R+   RF   R?   R@   R   RH   (   R   RL   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   join—   s    
c         C@  s   d |  _  |  j j ƒ  d  S(   Ni    (   R>   R.   R0   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRD   ž   s    	c         C@  s›   x5 |  j  |  j k  r7 |  j j |  j  k r7 |  j ƒ  q Wx0 |  j  |  j |  j j k rj |  j j d  ƒ q; W|  j  rŠ |  j j |  j	 ƒ n |  j j
 ƒ  d  S(   N(   RB   R&   R?   R@   RE   RG   R#   R.   RI   RJ   RK   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _adjust_step¢   s    *	c         C@  sT   d } xG t  rO |  j ƒ  |  j |  j k r/ d  St | ƒ t | d d ƒ } q	 Wd  S(   Ng-Cëâ6?i   gš™™™™™©?(   R   RQ   RB   R&   R   RH   (   R   RL   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _adjust_wait¯   s    	

c         C@  sB   |  j  ƒ  |  j r> |  j |  j k r> t j |  j ƒ |  _ n  d  S(   N(   RQ   R'   RB   R&   R	   t   spawnRR   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR7   ¸   s    
c         C@  sc   |  j   |  j d 7_ Wd  QXy t |  j d ƒ Wn) |  j   |  j d 8_ Wd  QX‚  n Xd  S(   Ni   (    (   RN   RB   R   t   _ThreadPool__trampoline(   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRE   ¾   s    

c         O@  s¸   x* |  j  } | j ƒ  | |  j  k r Pq q Wd } yQ |  j } t ƒ  } t | |  j | j ƒ } | j | | | | f ƒ |  j	 ƒ  Wn- | d k	 r£ | j
 ƒ  n  | j ƒ  ‚  n X| S(   sß   
        Add a new task to the threadpool that will run ``func(*args, **kwargs)``.

        Waits until a slot is available. Creates a new thread if necessary.

        :return: A :class:`gevent.event.AsyncResult`.
        N(   R5   t   acquireR#   R?   R   R   R%   t   releaseRG   R7   t   destroy(   R   t   funct   argst   kwargst	   semaphoret   thread_resultR?   t   result(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRS   È   s$    	
		
c         C@  sQ   t  d  k r d  St |  d d  ƒ } | d  k	 rM |  |  j d 8_ Wd  QXn  d  S(   NRN   i   (   t   sysR#   t   getattrRB   (   R   RN   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _decrease_sizeè   s    c         C@  s/   | d  k	 r+ | j d  k	 r+ | j j ƒ  n  d  S(   N(   R#   t   periodic_monitoring_threadt    ignore_current_greenlet_blocking(   R   R%   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt"   __ignore_current_greenlet_blockingõ   s    c         C@  s   t  |  ƒ } | j ƒ  d  S(   N(   R   t   switch(   R   t   g(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __trampolineù   s    c         C@  s’  t  } z1x*t ƒ  } | d  k	 r- d | _ n  |  j } |  j | ƒ | j ƒ  } zÅ | d  k rr t } |  j ƒ  d  S| \ } } } } z| y | | | Ž  }	 WnB t	 t
 d d  ƒ }
 |
 d  k rÂ d  S| j |  | f |
 ƒ  ƒ n! Xt
 d  k rï d  S| j |	 ƒ ~	 Wd  ~ ~ ~ ~ ~ XWd  t
 d  k r'd  S| j ƒ  Xq WWd  | rM|  j ƒ  n  t
 d  k	 r|  j rt ƒ  } | d  k	 r‡| j t  ƒ n  ~ n  Xd  S(   Ns   ThreadPool Worker Hubt   exc_info(   R   R   R#   t   nameR?   t-   _ThreadPool__ignore_current_greenlet_blockingt   getR-   R`   R_   R^   t   handle_errort   sett	   task_donet   _destroy_worker_hubRW   (   R   t   need_decreaset   hR?   t   taskRX   RY   RZ   R\   t   valueRg   R%   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR      sL    		
 	c         C@  s   |  j  | | | ƒ S(   s{   
        .. deprecated:: 1.1a2
           Identical to :meth:`apply`; the ``expected_errors`` argument is ignored.
        (   t   apply(   R   t   expected_errorst   functionRY   RZ   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   apply_e3  s    c         C@  s   t  ƒ  |  j k	 S(   N(   R$   R%   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _apply_immediatelyA  s    c         C@  s   | | ƒ d  S(   N(    (   R   t   callbackR]   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _apply_async_cb_spawnI  s    c         C@  s   t  S(   N(   R   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _apply_async_use_greenletL  s    N(!   R!   R"   t   __doc__R#   R   R:   R;   t   propertyR1   R    RA   RC   RM   R>   R/   RJ   RP   RD   RQ   RR   R7   RE   RS   R`   R   Rn   Ri   RT   R   Rv   Rw   Ry   Rz   (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   5   s8   															
	 	
			3		t
   _FakeAsyncc           B@  s3   e  Z d  „  Z e Z Z d „  Z d „  Z e Z RS(   c         C@  s   d  S(   N(    (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   sendR  s    c         C@  s   d S(   s   fake out for 'receiver'N(    (   R   R]   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __call_V  s    c         C@  s   t  S(   N(   R-   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __bool__Y  s    (   R!   R"   R~   R0   RK   t   _FakeAsync__call_R€   t   __nonzero__(    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR}   P  s
   	
		c           B@  sS   e  Z d Z d „  Z e d „  ƒ Z d	 „  Z d
 „  Z d „  Z d „  Z	 d „  Z
 RS(   Rg   t   async_watchert   _call_when_readyRr   t   contextR%   t   receiverc         C@  s_   | |  _  | |  _ d  |  _ d  |  _ d |  _ | j j ƒ  |  _ | |  _	 |  j j
 |  j ƒ d  S(   N(    (   R†   R%   R#   R…   Rr   Rg   R+   t   async_Rƒ   R„   RI   t	   _on_async(   R   R†   R%   t   call_when_ready(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   f  s    						c         C@  s   |  j  r |  j  d Sd  S(   Ni   (   Rg   R#   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt	   exceptionp  s    c         C@  sÄ   |  j  j ƒ  |  j  j ƒ  |  j ƒ  zZ |  j rL |  j j |  j |  j Œ n  d  |  _ t	 |  _  d  |  _ t	 |  _ |  j
 |  ƒ Wd  t	 |  _
 d  |  _ |  j r¿ |  j d |  j d d  f |  _ n  Xd  S(   Ni    i   (   Rƒ   RK   R0   R„   Rg   R%   Rk   R…   R#   R}   R†   Rr   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRˆ   t  s    
								c         C@  sK   |  j  j ƒ  |  j  j ƒ  t |  _  d  |  _ d  |  _ t |  _ t |  _ d  S(   N(	   Rƒ   RK   R0   R}   R#   R…   R%   R„   R†   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRW   Œ  s    				c         C@  s   | |  _  |  j j ƒ  d  S(   N(   Rr   Rƒ   R~   (   R   Rr   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRl   –  s    	c         C@  s#   | |  _  | |  _ |  j j ƒ  d  S(   N(   R…   Rg   Rƒ   R~   (   R   R…   Rg   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRk   š  s    		c         C@  s   |  j  d  k S(   N(   RŠ   R#   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt
   successful   s    (   Rg   Rƒ   R„   Rr   R…   R%   R†   (   R!   R"   t	   __slots__R   R|   RŠ   Rˆ   RW   Rl   Rk   R‹   (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   `  s    	
		
		c         C@  s8   y t  | | | Ž  f SWn |  k
 r3 } t | f SXd S(   sM   
    .. deprecated:: 1.1a2
       Previously used by ThreadPool.apply_e.
    N(   R   R-   (   t   errorsRu   RY   RZ   t   ex(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   wrap_errors¤  s    t   ThreadPoolExecutor(   t   Timeout(   t   Lazy(   t   _basec         @  s   ‡  ‡ f d †  } t  | _ | S(   Nc         @  sH   ~  y ˆ  ˆ ƒ Wn0 t  k
 rC ˆ j j ˆ  ˆ f t j ƒ  Œ n Xd  S(   N(   t	   ExceptionR%   t   print_exceptionR^   Rg   (   t   _(   t   fnt   future(    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   cbwrapº  s
    (   R   t   auto_unlink(   R˜   R—   R™   (    (   R—   R˜   s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _wrap_error¹  s    
	c         @  s   ‡  ‡ f d †  } t  | _ | S(   Nc         @  s   ˆ  ˆ ƒ d  S(   N(    (   R–   (   R—   R˜   (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   fÈ  s    (   R   Rš   (   R˜   R—   Rœ   (    (   R—   R˜   s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _wrapÇ  s    	t   _FutureProxyc           B@  s•   e  Z d  „  Z e d „  ƒ Z e d „  ƒ Z d „  Z e e _ e	 d „  ƒ Z
 d „  Z d d „ Z d d „ Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   c         C@  s   | |  _  d  S(   N(   t   asyncresult(   R   RŸ   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   Î  s    c         C@  sQ   d d l  m } | j d ƒ s+ |  j ƒ  rA d d  l } | j ƒ  St d ƒ ‚ d  S(   Ni    (   t   monkeyt	   threadingt
   _condition(   t   geventR    t   is_module_patchedt   doneR¡   t	   Conditiont   AttributeError(   R   R    R¡   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR¢   Ó  s
    
c         C@  s   |  j  j |  j ƒ g  S(   N(   RŸ   t   rawlinkt   _FutureProxy__when_done(   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _waitersÞ  s    c         C@  sM   t  |  d ƒ } x7 | D]/ } |  j ƒ  r8 | j |  ƒ q | j |  ƒ q Wd  S(   NRª   (   R_   R‹   t
   add_resultt   add_exception(   R   R–   t   waiterst   w(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __when_doneã  s
    c         C@  s   |  j  ƒ  r t j St j S(   N(   R¥   t   cfbt   FINISHEDt   RUNNING(   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _stateï  s    c         C@  s   d  S(   N(    (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   set_running_or_notify_cancelõ  s    c         C@  s>   y |  j  j d | ƒ SWn  t k
 r9 t j j ƒ  ‚ n Xd  S(   Nt   timeout(   RŸ   R]   t   GTimeoutt
   concurrentt   futurest   TimeoutError(   R   Rµ   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR]   ú  s    c         C@  sH   y! |  j  j d | ƒ |  j  j SWn  t k
 rC t j j ƒ  ‚ n Xd  S(   NRµ   (   RŸ   Rj   RŠ   R¶   R·   R¸   R¹   (   R   Rµ   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRŠ     s
    c         C@  s6   |  j  ƒ  r | |  ƒ n |  j j t |  | ƒ ƒ d  S(   N(   R¥   RŸ   R¨   R›   (   R   R—   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   add_done_callback	  s    c         C@  s   |  j  j t |  | ƒ ƒ d  S(   N(   RŸ   R¨   R   (   R   R—   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR¨     s    c         C@  s   t  |  j ƒ S(   N(   t   strRŸ   (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __str__  s    c         C@  s   t  |  j | ƒ S(   N(   R_   RŸ   (   R   Rh   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   __getattr__  s    N(   R!   R"   R   R’   R¢   Rª   R©   R   Rš   R|   R³   R´   R#   R]   RŠ   Rº   R¨   R¼   R½   (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRž   Í  s   		
					c           B@  s;   e  Z d  Z d „  Z d „  Z e d „ Z e Z d „  Z RS(   s  
        A version of :class:`concurrent.futures.ThreadPoolExecutor` that
        always uses native threads, even when threading is monkey-patched.

        The ``Future`` objects returned from this object can be used
        with gevent waiting primitives like :func:`gevent.wait`.

        .. caution:: If threading is *not* monkey-patched, then the ``Future``
           objects returned by this object are not guaranteed to work with
           :func:`~concurrent.futures.as_completed` and :func:`~concurrent.futures.wait`.
           The individual blocking methods like :meth:`~concurrent.futures.Future.result`
           and :meth:`~concurrent.futures.Future.exception` will always work.

        .. versionadded:: 1.2a1
           This is a provisional API.
        c         C@  s5   t  t |  ƒ j | ƒ t | ƒ |  _ t |  j _ d  S(   N(   t   superR   R   R   t   _threadpoolR   Rn   (   R   t   max_workers(    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR   *  s    c         O@  sN   |  j  ? |  j r" t d ƒ ‚ n  |  j j | | | Ž } t | ƒ SWd  QXd  S(   Ns*   cannot schedule new futures after shutdown(   t   _shutdown_lockt	   _shutdownt   RuntimeErrorR¿   RS   Rž   (   R   R—   RY   RZ   R˜   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   submit/  s
    
	c         C@  sN   t  t |  ƒ j | ƒ t |  j d d  ƒ } | rA |  j j ƒ  n  d  |  _ d  S(   NRD   (   R¾   R   t   shutdownR_   R¿   R#   RD   (   R   t   waitRD   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyRÅ   7  s
    c         C@  s   d  S(   N(    (   R   (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   _adjust_thread_countA  s    (	   R!   R"   R{   R   RÄ   R   RÅ   RD   RÇ   (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyR     s   		(5   t
   __future__R    R^   R(   t   weakrefR   R   R   R   t   gevent._compatR   t
   gevent.hubR   R$   R   R   R   t   gevent.eventR   t   gevent.greenletR	   t   gevent.poolR
   t   gevent.lockR   t   gevent._threadingR   R   R   R   t   __all__R   R   t   objectR}   R   R   t   concurrent.futuresR·   t   ImportErrort   appendt   gevent.timeoutR‘   R¶   t   gevent._utilR’   R“   R°   R›   R   Rž   R¸   R   (    (    (    s0   lib/python2.7/site-packages/gevent/threadpool.pyt   <module>   sL   	ÿ 	D	
		K