
    Sf                    X   d dl Z d dlZd dlZd dlZd dlZd dl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mZ ddlmZ ddlmZmZmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dlm(Z( d dl)m*Z*m+Z+ ddlm,Z,m-Z-m.Z. dZ/ej0        d          dk    Z1 ej2                    dk    r	ddl3m4Z5 eZ6nd dlm7Z5 ej6        Z6	 ej8        Z8n# e9$ r dZ8Y nw xY wej0        dk    rej:        Z;nej;        Z;d Z<dZ=dZ>d Z?dZ@dZAdZBdZCd ZDdZEdZF eGedd          ZHdZI eGedd           ZDdZJdZK ejL                    ZMejN        ZNd ZOd ZPd  ZQd! ZRdBd"ZS G d# d$e;          ZT G d% d&eU          ZV G d' d(eU          ZWd) ZX G d* d+          ZY G d, d-e          ZZ G d. d/eZ          Z[ G d0 d1eZ          Z\ G d2 d3eZ          Z] G d4 d5eZ          Z^ G d6 d7          Z_ G d8 d9          Z` G d: d;e`          Za G d< d=          Zb G d> d?eb          Zc G d@ dAe_          ZddS )C    N)deque)partial   )	cpu_countget_context)util)TERM_SIGNALhuman_statuspickle_loadsreset_signalsrestart_state)	get_errnomem_rsssend_offset)ExceptionInfo)DummyProcess)CoroStopRestartFreqExceededSoftTimeLimitExceeded
TerminatedTimeLimitExceededTimeoutErrorWorkerLostError	monotonicQueueEmpty)FinalizedebugwarningzEchild process exiting after exceeding memory limit ({0}KiB / {1}KiB)
   Windows)kill_processtree)killg    _B)r"   r"            SIGUSR1g      $@EX_OKi,  皙?c                     	 | j         }n# t          $ r d }Y nw xY w|'t          t           |                                           S |S N)r   AttributeErrorr   fileno)
connectionnatives     ?/var/www/html/env/lib/python3.11/site-packages/billiard/pool.py_get_send_offsetr3   x   s[    '   ~{J$5$5$7$7888Ms   
 c                 .    t          t          |            S r-   )listmapargss    r2   mapstarr9      s    T
    c                 ^    t          t          j        | d         | d                             S )Nr   r   )r5   	itertoolsstarmapr7   s    r2   starmapstarr>      s%    	!$q'4733444r:   c                 J     t          j                    j        | g|R i | d S r-   )r   
get_loggererror)msgr8   kwargss      r2   rA   rA      s3    DOC1$111&11111r:   c                 ^    | t          j                    ur|                     |           d S d S r-   )	threadingcurrent_threadstop)threadtimeouts     r2   stop_if_not_currentrJ      s6    Y-////G 0/r:   c                   T    e Zd ZdZd ZerddZd Zd Zd Z	dS dd	Zd
 Zd Zd Z	dS )LaxBoundedSemaphorez^Semaphore that checks that # release is <= # acquires,
    but ignores if # releases >= value.c                 N    | xj         dz  c_         |                                  d S Nr   )_initial_valueacquireselfs    r2   shrinkzLaxBoundedSemaphore.shrink   s'    q r:   r   Nc                 J    t                               | |           || _        d S r-   
_Semaphore__init__rO   rR   valueverboses      r2   rW   zLaxBoundedSemaphore.__init__   s&    e,,,"'Dr:   c                     | j         5  | xj        dz  c_        | xj        dz  c_        | j                                          d d d            d S # 1 swxY w Y   d S rN   )_condrO   _valuenotifyrQ   s    r2   growzLaxBoundedSemaphore.grow   s     $ $##q(##q 
!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   :AAAc                     | j         }|5  | j        | j        k     r$| xj        dz  c_        |                                 d d d            d S # 1 swxY w Y   d S rN   )r\   r]   rO   
notify_allrR   conds     r2   releasezLaxBoundedSemaphore.release   s    :D & &;!444KK1$KKOO%%%& & & & & & & & & & & & & & & & & &   5AAAc                 ~    | j         | j        k     r,t                              |            | j         | j        k     *d S d S r-   )r]   rO   rV   rd   rQ   s    r2   clearzLaxBoundedSemaphore.clear   sD    + 333""4((( + 3333333r:   c                 L    t                               | ||           || _        d S r-   rU   rX   s      r2   rW   zLaxBoundedSemaphore.__init__   s(    eW555"'Dr:   c                     | j         }|5  | xj        dz  c_        | xj        dz  c_        |                                 d d d            d S # 1 swxY w Y   d S rN   )_Semaphore__condrO   _Semaphore__valuer^   rb   s     r2   r_   zLaxBoundedSemaphore.grow   s    (D  ##q(##&&!+&&                 re   c                     | j         }|5  | j        | j        k     r$| xj        dz  c_        |                                 d d d            d S # 1 swxY w Y   d S rN   )rj   rk   rO   	notifyAllrb   s     r2   rd   zLaxBoundedSemaphore.release   s    (D % %)D,???**a/**NN$$$% % % % % % % % % % % % % % % % % %re   c                 ~    | j         | j        k     r,t                              |            | j         | j        k     *d S d S r-   )rk   rO   rV   rd   rQ   s    r2   rg   zLaxBoundedSemaphore.clear   sF    (4+>>>""4((( (4+>>>>>>>r:   r   N)
__name__
__module____qualname____doc__rS   PY3rW   r_   rd   rg    r:   r2   rL   rL      s        + +    ,)	( 	( 	( 	(	$ 	$ 	$	& 	& 	&	) 	) 	) 	) 	)
	( 	( 	( 	(	 	 		% 	% 	%	) 	) 	) 	) 	)r:   rL   c                   .     e Zd ZdZ fdZd Zd Z xZS )MaybeEncodingErrorzVWraps possible unpickleable errors, so they can be
    safely sent through the socket.c                     t          |          | _        t          |          | _        t                                          | j        | j                   d S r-   )reprexcrY   superrW   )rR   rz   rY   	__class__s      r2   rW   zMaybeEncodingError.__init__   sA    99%[[
4:.....r:   c                 B    d| j         j        dt          |           dS )N<z: >)r|   rp   strrQ   s    r2   __repr__zMaybeEncodingError.__repr__   s$     !^444c$iiii@@r:   c                 (    d| j         d| j        dS )NzError sending result: 'z'. Reason: 'z'.)rY   rz   rQ   s    r2   __str__zMaybeEncodingError.__str__   s     JJJ" 	"r:   )rp   rq   rr   rs   rW   r   r   __classcell__r|   s   @r2   rw   rw      sc        ' '/ / / / /
A A A" " " " " " "r:   rw   c                       e Zd ZdZdS )WorkersJoinedzAll workers have terminated.N)rp   rq   rr   rs   ru   r:   r2   r   r      s        &&&&r:   r   c                     t                      r-   )r   )signumframes     r2   soft_timeout_sighandlerr      s    

!
!!r:   c                   t    e Zd Z	 	 	 	 ddZd Zd Zd ZddZd	 Zd
 Z	e
edfdZd Zd Zd ZefdZd ZdS )WorkerNru   Tc                    | t          |          t          k    r|dk    sJ || _        || _        || _        || _        || _        || _        |	| _        |||c| _	        | _
        | _        |
| _        || _        |                     |            d S Nr   )typeintinitializerinitargsmaxtasksmax_memory_per_child	_shutdownon_exitsigprotectioninqoutqsynqwrap_exceptionon_ready_countercontribute_to_object)rR   r   r   r   r   r   r   sentinelr   r   r   r   r   s                r2   rW   zWorker.__init__   s     DNNc$9$9hlllK&  $8!!*),dD&$)TY, 0!!$'''''r:   c                 r   | j         | j        | j        c|_         |_        |_        | j         j                                        |_        | j        j                                        |_        | j        re| j        j                                        |_        | j        j                                        |_	        t          | j        j                  |_        nd x|_        x|_	        |_        | j         j        j        |_        | j        j        j        |_        t          | j         j                  |_        |S r-   )r   r   r   _writerr/   inqW_fd_readeroutqR_fdsynqR_fdsynqW_fdr3   send_syn_offset_send_syn_offsetsend
_quick_putrecv
_quick_getsend_job_offset)rR   objs     r2   r   zWorker.contribute_to_object   s    &*h	49#38h&--//y(//119 	F9,3355CL9,3355CL"2493D"E"ECAEECLE3<#*>).*/.tx/?@@
r:   c                     | j         | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        ffS r-   )r|   r   r   r   r   r   r   r   r   r   r   r   rQ   s    r2   
__reduce__zWorker.__reduce__  sI    ~HdiD,<M4=$.$, 3T5N 
 
 	
r:   c                 P   t           j        d gdfd	}|t           _        t          j                    }|                                  |                                  |                     |           	 t          j        |                     |                     nG# t          $ r:}t          d| |d           | 
                    |d         |           Y d }~nd }~ww xY w| 
                    |d         d            d S # | 
                    |d         d            w xY w)Nc                 $    | d<    |           S r   ru   )status_exit	_exitcodes    r2   exitzWorker.__call__.<locals>.exit  s    !IaL5== r:   pidzPool process %r error: %rr   exc_infor   r-   )sysr   osgetpid_make_child_methods
after_forkon_loop_startworkloop	ExceptionrA   _do_exit)rR   r   r   rz   r   r   s       @@r2   __call__zWorker.__call__  sJ   F		! 	! 	! 	! 	! 	! 	! ikk  """s###	3HT]]s]++,,,, 	2 	2 	2-tS1EEEEMM#y|S11111111	2 MM#y|T22222DMM#y|T2222s0   7(B  D  
C$*0CD C$$D D%c                 z   ||rt           nt          }| j        |                     ||           t          j        dk    rg	 | j                            t          ||ff           t          j	        d           t          j        |           d S # t          j        |           w xY wt          j        |           d S )Nwin32r   )
EX_FAILUREr*   r   r   platformr   putDEATHtimesleepr   r   )rR   r   exitcoderz   s       r2   r   zWorker._do_exit*  s    %(3zzeH<#LLh'''<7""#	usHo6777
1"""""""""HXs   7B B$c                     d S r-   ru   rR   r   s     r2   r   zWorker.on_loop_start:      r:   c                     |S r-   ru   )rR   results     r2   prepare_resultzWorker.prepare_result=  s    r:   c                     |pt          j                    } j        j        } j        } j        } j        } j        pd} j        }	 j	        }
 j
         fd}d}	 |
|r||k     r |
            }|r|\  }}|t          k    sJ |\  }}}}} |t          || |            ||ff           r ||          }|sb	 d |	 ||i |          f}n # t          $ r dt                      f}Y nw xY w	  |t          ||||ff           n|# t          $ ro}t!          j                    \  }}}	 t%          ||d                   }t          t$          ||f          } |t          ||d|f|ff           ~n# ~w xY wY d }~nd }~ww xY w|dz  }|dk    rtt'                      }|dk    rt)          d           |dk    rK||k    rEt+          t,                              ||                     t0                               |           S ||r||k      |d|           |r+||k    rt0          nt4          	                      |           S t6                               |           S #                      |           w xY w)	Nr   c                     d}	 |dk    r/t          d| j        j                                        d                        }|r!|\  }}|t          k    rdS |t
          k    sJ dS |dz  }h)Nr   r   <   z(!!!WAIT FOR ACK TIMEOUT: job:%r fd:%r!!!r   FT)rA   r   r   r/   NACKACK)jidireqtype_r8   _wait_for_synrR   s        r2   wait_for_synz%Worker.workloop.<locals>.wait_for_synL  s    Ar66Dty07799AG G G G#moo  "%KE4}}$u C<<<<4Qr:   TFr   z'worker unable to determine memory usage)	completedzworker exiting after %d tasks)r   r   r   r   r   r   r   r   r   wait_for_jobr   TASKr   r   r   READYr   r   rw   r   rA   r!   MAXMEM_USED_FMTformat
EX_RECYCLE_ensure_messages_consumedr   r*   )rR   r    nowr   r   r   r   r   r   r   r   r   r   r   r   args_jobr   funr8   rC   confirmr   rz   _tbwrappedeinfoused_kbr   s   `                            @r2   r   zWorker.workloop@  ss    RY[[im,==#8=A,()	 	 	 	 	 	 	/	@"x"I4H4H"lnn !.#&LE5 D====05-CCvCsAssuuc8<=>>>$ %".,s"3"3& %$:"&ssD7KF7K7K(L(L!M$ : : :"'!9:$US!VW$=>????$ 	$ 	$ 	$#&<>>1b$&8fQi&H&HG$1 2GR3 % %E  Ca%(I JKKK "GGGG	$ NI+a//")))"a<<!"KLLL"Q;;75I+I+I#O$:$: ')=%? %? @ @ @#- **Y*????] "x"I4H4HJ E19=== K%.(%:%:zz
J **Y*????  **Y*????D**Y*????s    A"I, C I, C41I, 3C44I, 8D I, 
FF1AE86F8E;;F>I, FA+I, 
-I, I, ,Jc                     | j         sdS t          t                    D ]>}| j         j        |k    rt	          d|            dS t          j        t                     ?t          d           dS )zr Returns true if all messages sent out have been received and
        consumed within a reasonable amount of time Fz*ensured messages consumed after %d retriesTz<could not ensure all messages were consumed prior to exiting)	r   range)GUARANTEE_MESSAGE_CONSUMPTION_RETRY_LIMITrY   r    r   r   ,GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVALr!   )rR   r   retrys      r2   r   z Worker._ensure_messages_consumed  s     $ 	5DEE 	E 	EE$*i77BEJJJttJCDDDD  	 	 	ur:   c                    t          | j        d          r| j        j                                         t          | j        d          r| j        j                                         | j         | j        | j          t          | j	                   t          t          j        t          t                     	 t          j        t          j        t          j                   d S # t          $ r Y d S w xY w)Nr   r   )full)hasattrr   r   closer   r   r   r   r   r   SIG_SOFT_TIMEOUTsignalr   SIGINTSIG_IGNr.   rQ   s    r2   r   zWorker.after_fork  s    48Y'' 	%H""$$$49i(( 	&I##%%%'Ddm,, 	4-.... 'M*,CDDD	M&-88888 	 	 	DD	s   9)C$ $
C21C2c                     |j         t          |d          r>|j        j        t          |d          r|j        r|j        t
          ffd	}nfd}nfd}|S )Nr   get_payloadc                 .    d |                       fS NTru   )rI   loadsr   s     r2   _recvz'Worker._make_recv_method.<locals>._recv  s    {{}}!5!555r:   c                 6     |           rd             fS dS NTFNru   )rI   _pollgets    r2   r  z'Worker._make_recv_method.<locals>._recv  s(    uW~~ +#SSUU{*&;r:   c                 N    	 d |           fS # t           j        $ r Y dS w xY wNTrI   r  r   )rI   r  s    r2   r  z'Worker._make_recv_method.<locals>._recv  sD    'W!5!5!555{ ' ' '&;;'s    $$)r  r   r   pollr   r   )rR   connr  r  r  r   s      @@@r2   _make_recv_methodzWorker._make_recv_method  s    h4## 	'L%Et]++ 	'0@ 	'".)5 6 6 6 6 6 6 6' ' ' ' ' ' '
' ' ' ' '
 r:   c                     |                      | j                  | _        | j        r|                      | j                  nd | _        d S r-   )_make_protected_receiver   r   r   r   )rR   r  s     r2   r   zWorker._make_child_methods  sJ     88BB $	4T99$)DDD/3 	r:   c                 x    |                      |          | j        r| j        j        nd t          ffd	}|S )Nc                    r)             r | d           t          t                    	  d          \  }}|sd S nn# t          t          f$ rZ}t	          |          t
          j        k    rY d }~d S  | dt          |          j                   t          t                    d }~ww xY w| | d           t          t                    |S )Nzworker got sentinel -- exiting      ?zworker got %s -- exiting)

SystemExitr*   EOFErrorIOErrorr   errnoEINTRr   rp   r   )r    readyr   rz   _receiveshould_shutdowns       r2   receivez/Worker._make_protected_receive.<locals>.receive  s     (??#4#4 (6777 '''-%Xc]]
s  4 g& - - -S>>U[00444440$s))2DEEE ,,,	-
 {6777 ,,,Js   A B,B'52B''B,)r  r   is_setr    )rR   r  r  r  r  s      @@r2   r  zWorker._make_protected_receive  sZ    ))$//37>K$.//t 	 	 	 	 	 	 	$ r:   )
NNru   NNNTTNNr-   )rp   rq   rr   rW   r   r   r   r   r   r   r    r   r   r   r   r  r   r   r  ru   r:   r2   r   r      s       HJ7;48=A( ( ( ("  
 
 
3 3 3,         #	t K@ K@ K@ K@Z     ,  . )5 5 5 5 5
    r:   r   c                   D     e Zd Zd Zd Z fdZd Zd	dZd Zd Z	 xZ
S )

PoolThreadc                 b    t          j        |            t          | _        d| _        d| _        d S NFT)r   rW   RUN_state_was_starteddaemon)rR   r8   rC   s      r2   rW   zPoolThread.__init__  s-    d###!r:   c                    	 |                                  S # t          $ ri}t          dt          |           j        |d           t          t          j                    t                     t          j
                     Y d }~d S d }~wt          $ rD}t          dt          |           j        |d           t          j        d           Y d }~d S d }~ww xY w)NzThread %r crashed: %rr   r   )bodyr   rA   r   rp   _killr   r   r	   r   r   r   r   rR   rz   s     r2   runzPoolThread.run  s    
	99;;" 	 	 	)4::+>   ")++{+++HJJJJJJJJJ 	 	 	)4::+>   HQKKKKKKKKK	s!    
CABC9CCc                 V    d| _          t          t          |           j        |i | d S r  )r$  r{   r  start)rR   r8   rC   r|   s      r2   r,  zPoolThread.start  s3     %j$%t6v66666r:   c                     d S r-   ru   rQ   s    r2   on_stop_not_startedzPoolThread.on_stop_not_started  r   r:   Nc                 j    | j         r|                     |           d S |                                  d S r-   )r$  joinr.  rR   rI   s     r2   rG   zPoolThread.stop	  s<     	IIgF  """""r:   c                     t           | _        d S r-   )	TERMINATEr#  rQ   s    r2   	terminatezPoolThread.terminate  s    r:   c                     t           | _        d S r-   )CLOSEr#  rQ   s    r2   r   zPoolThread.close  s    r:   r-   )rp   rq   rr   rW   r*  r,  r.  rG   r4  r   r   r   s   @r2   r  r    s            7 7 7 7 7  # # # #           r:   r  c                   $     e Zd Z fdZd Z xZS )
Supervisorc                 V    || _         t                                                       d S r-   )poolr{   rW   )rR   r:  r|   s     r2   rW   zSupervisor.__init__  s&    	r:   c                    t          d           t          j        d           | j        }	 |j        }t	          d|j        z  d          |_        t          d          D ]J}| j        t          k    r8|j        t          k    r(|	                                 t          j        d           K||_        | j        t          k    rX|j        t          k    rH|	                                 t          j        d           | j        t          k    r|j        t          k    Hn7# t          $ r* |                                 |                                  w xY wt          d           d S )Nzworker handler startingg?
   r   r+   zworker handler exiting)r    r   r   r:  r   
_processesr   r#  r"  _maintain_poolr   r   r0  )rR   r:  
prev_stater   s       r2   r'  zSupervisor.body  sJ   '(((
3y	 +J!.rDO/CQ!G!GD2YY $ $;#%%$+*<*<'')))JsOOO ",D+$$););##%%%
3 +$$);); # 	 	 	JJLLLIIKKK	 	&'''''s   C-D 4E)rp   rq   rr   rW   r'  r   r   s   @r2   r8  r8    sG            ( ( ( ( ( ( (r:   r8  c                   0     e Zd Z fdZd Zd Zd Z xZS )TaskHandlerc                     || _         || _        || _        || _        || _        t                                                       d S r-   )	taskqueuer   outqueuer:  cacher{   rW   )rR   rC  r   rD  r:  rE  r|   s         r2   rW   zTaskHandler.__init__=  sB    " 	
r:   c           	      B   | j         }| j        }| j        }t          |j        d           D ]O\  }}d }d}	 t          |          D ]\  }}| j        rt          d            n	  ||           *# t          $ r t          d           Y  nxt          $ rL |d d         \  }}		 ||         
                    |	dt                      f           n# t          $ r Y nw xY wY w xY w|rt          d            ||dz               n# t          $ rj |r
|d d         nd\  }}	||v r-||         
                    |	dz   dt                      f           |r"t          j        d            ||dz              Y Mw xY wt          d	           |                                  d S )
Nz'task handler found thread._state != RUNzcould not put task on queuer&   Fzdoing set_length()r   )r   r   ztask handler got sentinel)rE  rC  r   iterr  	enumerater#  r    r  r   _setr   KeyErrorr   tell_others)
rR   rE  rC  r   taskseq
set_lengthtaskr   r   inds
             r2   r'  zTaskHandler.bodyE  s"   
N	h#'	t#<#< !	/ !	/GZDA&(11  GAt{ GHHH
!D				"   ;<<<$ ! ! !#'8S!!#JOOC%1IJJJJ' ! ! ! D!	! " *2333"
1q5))) & & &'+7488S%<<#JOOC!Ge]__-EFFF &J3444Jq1u%%%& -...sf   ,D#A/.D/C DC "*CC 
C	C C	C DC  "DA0E98E9c                    | j         }| j        }| j        }	 t          d           |                    d            t          d           |D ]} |d            n# t          $ r t          d           Y nw xY wt          d           d S )Nz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got IOError when sending sentinelsztask handler exiting)rD  r   r:  r    r  )rR   rD  r   r:  ps        r2   rL  zTaskHandler.tell_otherso  s    =hy
	ECDDDLL <===  D				 	E 	E 	ECDDDDD	E 	$%%%%%s   AA A76A7c                 .    |                                   d S r-   )rL  rQ   s    r2   r.  zTaskHandler.on_stop_not_started  s    r:   )rp   rq   rr   rW   r'  rL  r.  r   r   s   @r2   rA  rA  ;  sf            ( ( (T& & &&      r:   rA  c                   H     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
 xZS )	TimeoutHandlerc                     || _         || _        || _        || _        d | _        t                                                       d S r-   )	processesrE  t_softt_hard_itr{   rW   )rR   rW  rE  rX  rY  r|   s        r2   rW   zTimeoutHandler.__init__  sB    "
r:   c                 `    t          fdt          | j                  D             d          S )Nc              3   <   K   | ]\  }}|j         k    ||fV  d S r-   r   .0r   procr   s      r2   	<genexpr>z1TimeoutHandler._process_by_pid.<locals>.<genexpr>  ?       
 
!!Tx3 1I
 
r:   NN)nextrI  rW  r   s    `r2   _process_by_pidzTimeoutHandler._process_by_pid  sJ     
 
 
 
%.t~%>%>
 
 
   	r:   c                 6   t          d|           |                     |j                  \  }}|sd S |                    d           	 t	          |j        t
                     d S # t          $ r)}t          |          t          j	        k    r Y d }~d S d }~ww xY w)Nzsoft time limit exceeded for %rTsoft)
r    rd  _worker_pidhandle_timeoutr(  r   OSErrorr   r  ESRCH)rR   r   process_indexrz   s        r2   on_soft_timeoutzTimeoutHandler.on_soft_timeout  s    /555..s?? 	F 	%%%	#/#344444 	 	 	~~,, -,,,,,	s   	A% %
B/BBc                    |                                 rd S t          d|           	 t          |j                  # t          $ r, |                    |j        dt                      f           Y nw xY w|                     |j                  \  }}|	                    d           |r| 
                    |           d S d S )Nzhard time limit exceeded for %rFrf  )r  r    r   _timeoutrJ  _jobr   rd  rh  ri  _trywaitkill)rR   r   rl  rm  s       r2   on_hard_timeoutzTimeoutHandler.on_hard_timeout  s    99;; 	F/555	#CL111  	9 	9 	9HHSX}788888	9 ..s?? 	&&& 	'g&&&&&	' 	's   < 3A21A2c                    t          d|j                   	 t          j        |j                  |j        k    rLt          d|j                   t          j        t          j        |j                  t          j                   n|                                 |j	        
                    d          rd S n# t          $ r Y nw xY wt          d|j                   	 t          j        |j                  |j        k    rMt          d|j                   t          j        t          j        |j                  t          j                   d S t          |j        t                     d S # t          $ r Y d S w xY w)Nztimeout: sending TERM to %szIworker %s is a group leader. It is safe to kill (SIGTERM) the whole groupr+   r  z/timeout: TERM timed-out, now sending KILL to %szIworker %s is a group leader. It is safe to kill (SIGKILL) the whole group)r    _namer   getpgidr   killpgr   SIGTERMr4  _popenwaitrj  SIGKILLr(  rR   workers     r2   rr  zTimeoutHandler._trywaitkill  sn   +V\:::
	z&*%%33acicmnnn	"*VZ00&.AAAA  """ }!!#!..   	 	 	D	
 	?NNN	z&*%%33acicmnnn	"*VZ00&.AAAAAfj'***** 	 	 	DD	s+   BB7 7
CCA-E( E( (
E65E6c              #     K   | j         | j        }}t                      }| j        }| j        }d }| j        t          k    rt          j        | j                  |rt          fd|D                       }	                                D ]j\  }}|j
        }	|j        }
|
|}
|j        }||} ||	|          r ||           :||vr, ||	|
          r  ||           |                    |           kd V  | j        t          k    d S d S )Nc                 @    | r|sdS t                      | |z   k    rdS d S r!  r   )r,  rI   s     r2   
_timed_outz2TimeoutHandler.handle_timeouts.<locals>._timed_out  s6      u{{ego--t .-r:   c              3   $   K   | ]
}|v |V  d S r-   ru   )r^  krE  s     r2   r`  z1TimeoutHandler.handle_timeouts.<locals>.<genexpr>  s'      ;;!U

A



;;r:   )rY  rX  setrn  rs  r#  r"  copyrE  items_time_accepted_soft_timeoutrp  add)rR   rY  rX  dirtyrn  rs  r  r   r   ack_timesoft_timeouthard_timeoutrE  s               @r2   handle_timeoutszTimeoutHandler.handle_timeouts  sV     dk..	 	 	 kS   Idj))E  <;;;;u;;;;;++-- ! !3-"0'#)L"|'#)L:h55 !#OC((((e^^

8\(J(J^#OC(((IIaLLLEEE/ kS      r:   c                     | j         t          k    rM	 |                                 D ]}t          j        d           n# t
          $ r Y nw xY w| j         t          k    Mt          d           d S )Nr  ztimeout handler exiting)r#  r"  r  r   r   r   r    rR   r   s     r2   r'  zTimeoutHandler.body  s    kS  --// $ $AJsOOOO$   	 kS   	'(((((s   +> 
A
Ac                     | j         |                                 | _         	 t          | j                    d S # t          $ r d | _         Y d S w xY wr-   )rZ  r  rc  StopIterationrR   r8   s     r2   handle_eventzTimeoutHandler.handle_event   s[    8++--DH	NNNNN 	 	 	DHHHH	s   8 AA)rp   rq   rr   rW   rd  rn  rs  rr  r  r'  r  r   r   s   @r2   rU  rU    s                ' ' '*  .$ $ $L) ) )      r:   rU  c                   L     e Zd Z	 d fd	Zd Zd ZddZddZd Zdd
Z	 xZ
S )ResultHandlerNc                    || _         || _        || _        || _        || _        || _        || _        d | _        d| _        || _	        |	| _
        |
| _        |                                  t                                                       d S )NF)rD  r  rE  r  join_exited_workersputlockr   rZ  _shutdown_completecheck_timeoutson_job_readyon_ready_counters_make_methodsr{   rW   )rR   rD  r  rE  r  r  r  r   r  r  r  r|   s              r2   rW   zResultHandler.__init__  s     !
	#6 *"',(!2r:   c                 2    |                      d           d S )NT)r  )finish_at_shutdownrQ   s    r2   r.  z!ResultHandler.on_stop_not_started  s    55555r:   c                     	  j          j         j         j        fd} fd}d }t          |t
          |t          |ix	 _        	fd}| _        d S )Nc                     d_         	 |                              ||||           d S # t          t          f$ r Y d S w xY wr   )R_ackrK  r.   )r   r   time_acceptedr   r   rE  r   s        r2   on_ackz+ResultHandler._make_methods.<locals>.on_ack'  sX    MOc
=#x@@@@@n-   s   * ??c                     | |||           	 |          }n# t           $ r Y d S w xY w
j        rt          t          |                                          d           }|rR|
j        v rI
j        |         }|                                5  |xj        dz  c_        d d d            n# 1 swxY w Y   |                                s		                                 	 |	                    ||           d S # t           $ r Y d S w xY wrN   )
rK  r  rc  rH  worker_pidsget_lockrY   r  rd   rJ  )r   r   r   r   item
worker_pidr   rE  r  r  rR   s          r2   on_readyz-ResultHandler._make_methods.<locals>.on_ready/  s   'S!S'222Sz    % 4!$t'7'7'9'9":":DAA
 4*0F"F"F'+'=j'I$)2244 4 4(..!3..4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ::<< &&OO%%%		!S!!!!!   s0    
**B,,B03B0"C: :
DDc                     	 t          j        | t                     d S # t          $ r)}t	          |          t
          j        k    r Y d }~d S d }~ww xY wr-   )r   r%   r	   rj  r   r  rk  )r   r   rz   s      r2   on_deathz-ResultHandler._make_methods.<locals>.on_deathF  sh    [)))))   S>>U[00 100000s    
AAAc                 n    | \  }}	  |         |  d S # t           $ r t          d||           Y d S w xY w)NzUnknown job state: %s (args=%s))rK  r    )rO  stater8   state_handlerss      r2   on_state_changez4ResultHandler._make_methods.<locals>.on_state_changeQ  se    KE4F%u%t,,,, F F F7EEEEEEFs    44)	rE  r  r   r  r   r   r   r  r  )
rR   r  r  r  r  rE  r  r  r   r  s
   `    @@@@@r2   r  zResultHandler._make_methods!  s    
,*(	 	 	 	 	 		 	 	 	 	 	 	 	.	 	 	 %0
 	
,	F 	F 	F 	F 	F  /r:   r  c              #     K   | j         }| j        }	 	  ||          \  }}n7# t          t          f$ r#}t	          d|           t                      d }~ww xY w| j        r/| j        t          k    sJ t	          d           t                      |r3|t	          d           t                       ||           |dk    rd S nd S d V  )Nr    result handler got %r -- exitingz,result handler found thread._state=TERMINATEzresult handler got sentinelr   )r  r  r  r  r    r   r#  r3  )rR   rI   r  r  r  rO  rz   s          r2   _process_resultzResultHandler._process_resultY  s     y.	!"d7mmttX& ! ! !8#>>>jj ! { !{i////DEEEjj  <7888"**$%%%a<<E   EEE+	s   " AAAc                     | j         t          k    rW| j        |                     d          | _        	 t	          | j                   d S # t
          t          f$ r d | _        Y d S w xY wd S r   )r#  r"  rZ  r  rc  r  r   )rR   r/   eventss      r2   r  zResultHandler.handle_eventt  sw    ;#x//22 TX!8,        s   A	 	A%$A%c                    t          d           	 | j        t          k    r:	 |                     d          D ]}n# t          $ r Y nw xY w| j        t          k    :|                                  d S # |                                  w xY w)Nzresult handler startingr  )r    r#  r"  r  r   r  r  s     r2   r'  zResultHandler.body}  s    '(((	&+$$!11#66     E	 +$$ ##%%%%%D##%%%%s+   A1 ; A1 
AA1 AA1 1BFc           
         d| _         | j        }| j        }| j        }| j        }| j        }| j        }| j        }d }	|r| j        t          k    r|
 |             	  |d          \  }
}n/# t          t          f$ r}t          d|           Y d }~d S d }~ww xY w|
r|t          d           r ||           	  |d           nn# t          $ ra t                      }|	s|}	nK||	z
  dk    rt          d           Y nIt          dt          t!          ||	z
  dz
  d	                               Y nw xY w|r| j        t          k    t#          |d
          r_t          d           	 t%          d          D ]'}|j                                        s n |             (n# t          t          f$ r Y nw xY wt          dt)          |          | j                   d S )NTr  r  z&result handler ignoring extra sentinel)shutdowng      @z!result handler exiting: timed outz6result handler: all workers terminated, timeout in %ssr   r   z"ensuring that outqueue is not fullr<  z7result handler exiting: len(cache)=%s, thread._state=%s)r  r  rD  rE  r  r  r  r  r#  r3  r  r  r    r   r   absminr   r   r   len)rR   r  r  rD  rE  r  r  r  r  time_terminater  rO  rz   r   r   s                  r2   r  z ResultHandler.finish_at_shutdown  s}   "&h=
y"6,. 	Cy00)   "d3iittX&   8#>>>  &<BCCC%%%C##T22222  
C 
C 
Ckk% C%(NN^+c11ABBB +c#"6"<a@@AAC C C
C#  	Cy00: 8Y'' 	6777r  A#+0022 CEEEEX&    	G%jj$+	' 	' 	' 	' 	'sB   A* *B;BB9C 5D1=1D10D1&7F F21F2r-   )r  rb  F)rp   rq   rr   rW   r.  r  r  r  r'  r  r   r   s   @r2   r  r  	  s         BF     $6 6 66/ 6/ 6/p   6       
& 
& 
&6' 6' 6' 6' 6' 6' 6' 6'r:   r  c                   H   e Zd ZdZdZeZeZeZeZe	Z	e
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d@dZd Zd Zd Zd Zd Zd Zd Zd Z d Z!dAdZ"dAdZ#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,di fd)Z-dBd*Z.	 	 dCd+Z/dBd,Z0dDd-Z1	 	 dDd.Z2di ddddddddddfd/Z3d0 Z4dBd1Z5	 	 dCd2Z6	 	 dCd3Z7e8d4             Z9d5 Z:d6 Z;d7 Z<e8d8             Z=d9 Z>d: Z?e8d;             Z@eAd<             ZBeAd=             ZCeDd>             ZEdS )EPoolzS
    Class which supports an async version of applying functions to arguments.
    TNru   r   Fc                    |pt                      | _        || _        |                                  t	                      | _        i | _        t          | _        || _	        || _
        || _        || _        || _        || _        || _        |pt           | _        |
| _        || _        || _        || _        || _        i | _        || _        t3          |p| j	        d up| j
        d u          | _        |r*t6          #t9          j        t=          d                     d }||                                 n|| _         |ptC          | j         dz            | _"        tG          ||	pd          | _#        |tI          |          stK          d          |tI          |          stK          d          | j        j&        | _'        g | _(        i | _)        i | _*        || _+        |ptY          | j                   | _-        t]          | j                   D ]}| /                    |           | 0                    |           | _1        |r| j1        2                                 | 3                    | j        | j4        | j5        | j(        | j                  | _6        |r| j6        2                                 d | _7        | j        rs| 8                    | j(        | j        | j
        | j	                  | _9        tu                      | _;        d| _<        | =                                 |s| j9        j>        | _7        nd | _9        d| _<        d | _;        | ?                                | _@        | j@        j>        | _A        |r| j@        2                                 t          | | jC        | j        | jD        | j5        | j(        | j1        | j6        | j@        | j        | j9        | E                                f
d          | _F        d S )	NWSoft timeouts are not supported: on this platform: It does not have the SIGUSR1 signal.d   r   zinitializer must be a callablez on_process_exit must be callableF   )r8   exitpriority)Gr   _ctxsynack_setup_queuesr   
_taskqueue_cacher"  r#  rI   r  _maxtasksperchild_max_memory_per_child_initializer	_initargs_on_process_exitLOST_WORKER_TIMEOUTlost_worker_timeouton_process_upon_process_downon_timeout_seton_timeout_cancelthreadsreadersallow_restartboolenable_timeoutsr   warningswarnUserWarningr   r=  roundmax_restartsr   callable	TypeErrorProcess_Process_pool	_poolctrl_on_ready_countersputlocksrL   _putlockr   _create_worker_processr8  _worker_handlerr,  rA  r   	_outqueue_task_handlerr  rU  _timeout_handlerLock_timeout_handler_mutex_timeout_handler_started_start_timeout_handlerr  create_result_handler_result_handlerhandle_result_eventr   _terminate_pool_inqueue_help_stuff_finish_args
_terminate)rR   rW  r   r   maxtasksperchildrI   r  r  r  max_restart_freqr  r  r  r  r  	semaphorer  r  r  on_process_exitcontextr   r  rC   r   s                            r2   rW   zPool.__init__  s   $ ,{}}	''(!1%9"'! /#6#M:M *.,!2*# *L$*T) 
  
  	 ,4M+I      L.7.?$..***Y(HE$/C2G,H,H*<9I9NQOO"8K+@+@"<===&x/H/H&>???	)
"$ !I%8%I%It'' 	+ 	+A''****#t44 	) &&(((!--do.2o.2n.2j.2k	; ;
  	'$$&&&"  	/$($7$7
DK!4<% %D! +/&&D',1D)'')))  I&*&;&H#$(D!,1D)*.D'  $99;;#'#7#D  	) &&((("$&/4=$.*d2D4F&'..00	2
 
 
 
r:   c                      | j         |i |S r-   )r  )rR   r8   kwdss      r2   r  zPool.ProcessH  s    t}d+d+++r:   c                 T    |                     |                     |                    S )N)target)r   r  r|  s     r2   WorkerProcesszPool.WorkerProcessK  s$    **4<<v<+F+FGGGr:   c                      | j         | j        | j        | j        | j        | j        | j        | j        | j        | j	        f	d| j
        i|S )Nr  )r  r  r   r  _poll_result_join_exited_workersr  r   r  r  r  )rR   extra_kwargss     r2   r  zPool.create_result_handlerN  sb    !t!NDOT[t8M4-t/B	
 
 261H	

 
 
 	
r:   c                     d S r-   ru   )rR   r   r   r   r   s        r2   r  zPool.on_job_readyW  r   r:   c                 *    | j         | j        | j        fS r-   )r  r  r  rQ   s    r2   r  zPool._help_stuff_finish_argsZ  s    }d0$*<<r:   c                 B    	 t                      S # t          $ r Y dS w xY wrN   )r   NotImplementedErrorrQ   s    r2   r   zPool.cpu_count]  s3    	;;" 	 	 	11	s    
c                       | j         j        | S r-   )r  r  r  s     r2   r  zPool.handle_result_eventc  s    0t#0$77r:   c                     d S r-   ru   )rR   r}  queuess      r2   _process_register_queueszPool._process_register_queuesf  r   r:   c                 `    t          fdt          | j                  D             d          S )Nc              3   <   K   | ]\  }}|j         k    ||fV  d S r-   r   r]  s      r2   r`  z'Pool._process_by_pid.<locals>.<genexpr>j  ra  r:   rb  )rc  rI  r  r   s    `r2   rd  zPool._process_by_pidi  sJ     
 
 
 
%.tz%:%:
 
 
   	r:   c                      | j         | j        d fS r-   )r  r  rQ   s    r2   get_process_queueszPool.get_process_queueso  s    }dnd22r:   c                    | j         r| j                                        nd }|                                 \  }}}| j                            d          }|                     |                     |||| j        | j        | j	        || j
        | j        | j        | j        |                    }| j                            |           |                     ||||f           |j                            dd          |_        d|_        ||_        |                                 || j        |j        <   || j        |j        <   | j        r|                     |           |S )Nr   )r   r   r   r   r  
PoolWorkerT)r  r  Eventr  Valuer  r   r  r  r  r  r  _wrap_exceptionr  r  appendr  namereplacer%  indexr,  r  r   r  r  )rR   r   r   r   r   r   r   ws           r2   r  zPool._create_worker_processr  sP   (,(:D49??$$$1133T49??3//t{{tT."Hd.C ,/!%!;-  + 	 
 	 
 	 	 	
!%%a#tT):;;;	<88				 (qu)9& 	"q!!!r:   c                     d S r-   ru   r|  s     r2   process_flush_queueszPool.process_flush_queues  r   r:   c           	      D   d}d t          | j                                                  D             D ]@}|pt                      }|j        \  }}||z
  |j        k    r|                     ||           A|r"t          | j                  st                      i i c}t          t          t          | j                                      D ]}| j        |         }|j        }	|j        }
|
|	t          d|           |
|                                 t          d|           ||j        <   |	||j        <   |	t"          t$          fvr<t'          |dd          s+t)          d|j        |j        t-          |	          d	           |                     |           | j        |= | j        |j        = | j        |j        = rd
 | j        D             t          | j                                                  D ]=}t5          fd|                                D             d          }|r|                     ||           |                                sl|                    |          pd}	                    |          }|r't'          |dd          r|                    |	           |                      |||	           |j!        }|j"        }|r1|#                                s|                     ||j                   |r/|#                                s|                     ||j                   ?                                D ]5}| j$        r,|s| %                    |           | $                    |           6t          |                                          S g S )zCleanup after any worker processes which have exited due to
        reaching their specified lifetime. Returns True if any workers were
        cleaned up.
        Nc                 H    g | ]}|                                 |j        | S ru   )r  _worker_lost)r^  r   s     r2   
<listcomp>z-Pool._join_exited_workers.<locals>.<listcomp>  s?     = = =C99;;=+.+;=C = = =r:   z!Supervisor: cleaning up worker %dzSupervisor: worked %d joined_controlled_terminationFz Process %r pid:%r exited with %rr   r   c                     g | ]	}|j         
S ru   r   r^  r  s     r2   r"  z-Pool._join_exited_workers.<locals>.<listcomp>  s    222!222r:   c              3   ,   K   | ]}|v s|v
|V  d S r-   ru   )r^  r   all_pidscleaneds     r2   r`  z,Pool._join_exited_workers.<locals>.<genexpr>  sA       ? ?Sw#X*=*= *=*=*=*=? ?r:   _job_terminated)&r5   r  valuesr   r!  _lost_worker_timeoutmark_as_worker_lostr  r  r   reversedr   r   ry  r    r0  r   r*   r   getattrrA   r  r
   r  r  r  rc  r  on_job_process_downr  r  _set_terminatedon_job_process_lost	_write_to_scheduled_for	_is_aliver  _process_cleanup_queues)rR   r  r   r   	lost_timelost_ret	exitcodesr   r}  r   popenacked_by_goner_  write_to	sched_forr'  r(  s                  @@r2   r  zPool._join_exited_workers  s   
 
= =4(:(:(<(<#=#= = = = 	8 	8C$C"%"2IxY!999((h777 	"C
OO 	"//!%DJ0011 	8 	8AZ]FHME} 491===$KKMMM4a888&,
#(0	&*%E:#666#F,EuMM 7:VZh1G1G!"   
 ))&111JqMN6:.+FJ7 $	,22tz222HDK..0011 E E $? ? ? ? ?COO$5$5 ? ? ?! ! ! E,,S-@@@99;; #,==#?#?#D1&{{=99 GD2CU$K$K //9999 44 #]H  
  #}H # 2I E(:(:(<(< E00hlCCCC" E9+>+>+@+@ E00imDDD!..** 1 1' 1# =44V<<<((000	((**+++	r:   c                     d S r-   ru   )rR   r   r}  s      r2   on_partial_readzPool.on_partial_read  r   r:   c                     d S r-   ru   r|  s     r2   r5  zPool._process_cleanup_queues  r   r:   c                     d S r-   ru   )rR   r   pid_gones      r2   r/  zPool.on_job_process_down  r   r:   c                 0    t                      |f|_        d S r-   )r   r!  )rR   r   r   r   s       r2   r1  zPool.on_job_process_lost  s    %KK2r:   c                     	 t          d                    t          |          |j                            # t           $ r( |                    d dt                      f           Y d S w xY w)Nz(Worker exited prematurely: {0} Job: {1}.F)r   r   r
   rq  rJ  r   )rR   r   r   s      r2   r,  zPool.mark_as_worker_lost  s~    	!:AA **CH6 6    	5 	5 	5HHTE=??3444444	5s   57 .A)(A)c                     | S r-   ru   rQ   s    r2   	__enter__zPool.__enter__      r:   c                 *    |                                  S r-   )r4  )rR   r   s     r2   __exit__zPool.__exit__  s    ~~r:   c                     d S r-   ru   rR   ns     r2   on_growzPool.on_grow  r   r:   c                     d S r-   ru   rJ  s     r2   	on_shrinkzPool.on_shrink  r   r:   c                 8   t          |                                           D ]j\  }}| xj        dz  c_        | j        r| j                                         |                                 |                     d           ||dz
  k    r d S kt          d          )Nr   z&Can't shrink pool. All processes busy!)rI  _iterinactiver=  r  rS   terminate_controlledrN  
ValueError)rR   rK  r   r}  s       r2   rS   zPool.shrink  s    "4#5#5#7#788 		G 		GIAvOOq OO} '$$&&&'')))NN1AEzz  EFFFr:   c                     t          |          D ]2}| xj        dz  c_        | j        r| j                                         3|                     |           d S rN   )r   r=  r  r_   rL  )rR   rK  r   s      r2   r_   z	Pool.grow  sY    q 	% 	%AOOq OO} %""$$$Qr:   c              #   P   K   | j         D ]}|                     |          s|V  d S r-   )r  _worker_activer|  s     r2   rP  zPool._iterinactive  sA      j 	 	F&&v.. 	 	r:   c                 z    | j                                         D ] }|j        |                                v r dS !dS )NTF)r  r*  r   r  )rR   r}  r   s      r2   rU  zPool._worker_active  sG    ;%%'' 	 	CzS__....tt /ur:   c                    t          | j        t          | j                  z
            D ]}| j        t
          k    r dS 	 |r/||         t          t          fvr| j        	                                 n)# t          $ r | j        	                                 Y nw xY w|                     |                                            t          d           dS )zBring the number of pool processes up to the specified number,
        for use after reaping workers which have exited.
        Nzadded worker)r   r=  r  r  r#  r"  r*   r   r   step
IndexErrorr  _avail_indexr    )rR   r8  r   s      r2   _repopulate_poolzPool._repopulate_pool#  s     tTZ899 		" 		"A{c!!* .1eZ5H!H!H&++--- * * *"'')))))*''(9(9(;(;<<<.!!!!		" 		"s    1A22#BBc                     t          | j                  | j        k     sJ t          d | j        D                       t	          fdt          | j                  D                       S )Nc              3   $   K   | ]}|j         V  d S r-   )r  )r^  rR  s     r2   r`  z$Pool._avail_index.<locals>.<genexpr>4  s$      22!ag222222r:   c              3   $   K   | ]
}|v|V  d S r-   ru   )r^  r   indicess     r2   r`  z$Pool._avail_index.<locals>.<genexpr>5  s-      JJ!'9I9IA9I9I9I9IJJr:   )r  r  r=  r  rc  r   )rR   r_  s    @r2   rZ  zPool._avail_index2  si    4:000022tz22222JJJJuT_55JJJJJJr:   c                 ,    |                                   S r-   )r  rQ   s    r2   did_start_okzPool.did_start_ok7  s    ,,....r:   c                     |                                  }|                     |           t          t          |                    D ]"}| j        | j                                         #dS )zF"Clean up any exited workers and start replacements for them.
        N)r  r[  r   r  r  rd   )rR   joinedr   s      r2   r>  zPool._maintain_pool:  sm     **,,f%%%s6{{## 	( 	(A}(%%'''	( 	(r:   c                 V   | j         j        t          k    r| j        t          k    r	 |                                  d S # t          $ r* |                                  |                                   t          $ r+}t          |          t          j
        k    rt          | d }~ww xY wd S d S r-   )r  r#  r"  r>  r   r   r0  rj  r   r  ENOMEMMemoryErrorr)  s     r2   maintain_poolzPool.maintain_poolC  s    &#--$+2D2D	##%%%%%&   

		   S>>U\11%3. .-2D2Ds   = <B$9&BB$c                       j                                          _         j                                          _         j        j        j         _         j        j        j         _	         fd}| _
        d S )Nc                 r    j         j                            |           rd                                fS dS r  )r  r   r  r   rI   rR   s    r2   r  z(Pool._setup_queues.<locals>._poll_resultV  s8    ~%**733 /T__....;r:   )r  SimpleQueuer  r  r   r   r   r   r   r   r  rR   r  s   ` r2   r  zPool._setup_queuesP  st    	--//..00-/4.05	 	 	 	 	 )r:   c                     | j         rP| j        K| j        5  | j        s d| _        | j                                         d d d            d S # 1 swxY w Y   d S d S d S r  )r  r  r  r  r,  rQ   s    r2   r  zPool._start_timeout_handler\  s     < 	2D1=, 2 24 248D1)//1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2	2 	2==s   (AAAc                 x    | j         t          k    r)|                     |||                                          S dS )z8
        Equivalent of `func(*args, **kwargs)`.
        N)r#  r"  apply_asyncr  )rR   funcr8   r  s       r2   applyz
Pool.applye  s=     ;###D$5599;;; r:   c                     | j         t          k    r/|                     ||t          |                                          S dS )z
        Like `map()` method but the elements of the `iterable` are expected to
        be iterables as well and will be unpacked as arguments. Hence
        `func` and (a, b) becomes func(a, b).
        N)r#  r"  
_map_asyncr>   r  rR   rp  iterable	chunksizes       r2   r=   zPool.starmapl  sB     ;#??4#.	; ;;>355A r:   c                 d    | j         t          k    r|                     ||t          |||          S dS )z=
        Asynchronous version of `starmap()` method.
        N)r#  r"  rs  r>   rR   rp  ru  rv  callbackerror_callbacks         r2   starmap_asynczPool.starmap_asyncv  s<    
 ;#??4;	#+^= = = r:   c                 x    | j         t          k    r)|                     |||                                          S dS )zx
        Apply `func` to each element in `iterable`, collecting the results
        in a list that is returned.
        N)r#  r"  	map_asyncr  rt  s       r2   r6   zPool.map  s;    
 ;#>>$)<<@@BBB r:   c                    | j         t          k    rdS |p| j        }|dk    rSt          | j        |          | j                            fdt          |          D             j        f           S |dk    sJ t          
                    ||          }t          | j        |          | j                            fdt          |          D             j        f           d D             S )zP
        Equivalent of `map()` -- can be MUCH slower than `Pool.map()`.
        Nr   r  c              3   F   K   | ]\  }}t           j        ||fi ffV  d S r-   r   rq  r^  r   xrp  r   s      r2   r`  zPool.imap.<locals>.<genexpr>  O       2 2Q atR89 2 2 2 2 2 2r:   c              3   P   K   | ] \  }}t           j        |t          |fi ffV  !d S r-   r   rq  r9   r^  r   r  r   s      r2   r`  zPool.imap.<locals>.<genexpr>  O       6 6Q a1$;< 6 6 6 6 6 6r:   c              3   $   K   | ]}|D ]}|V  d S r-   ru   r^  chunkr  s      r2   r`  zPool.imap.<locals>.<genexpr>  /      ??U??D???????r:   )r#  r"  r  IMapIteratorr  r  r   rI  _set_lengthr  
_get_tasksrR   rp  ru  rv  r  task_batchesr   s    `    @r2   imapz	Pool.imap  sV    ;#F1MT5M>>!$+6IK K KFO2 2 2 2 2&x002 2 2"!   
 Mq====??49EEL!$+6IK K KFO6 6 6 6&|446 6 6"!   
 @?f????r:   c                    | j         t          k    rdS |p| j        }|dk    rSt          | j        |          | j                            fdt          |          D             j        f           S |dk    sJ t          
                    ||          }t          | j        |          | j                            fdt          |          D             j        f           d D             S )zL
        Like `imap()` method but ordering of results is arbitrary.
        Nr   r  c              3   F   K   | ]\  }}t           j        ||fi ffV  d S r-   r  r  s      r2   r`  z&Pool.imap_unordered.<locals>.<genexpr>  r  r:   c              3   P   K   | ] \  }}t           j        |t          |fi ffV  !d S r-   r  r  s      r2   r`  z&Pool.imap_unordered.<locals>.<genexpr>  r  r:   c              3   $   K   | ]}|D ]}|V  d S r-   ru   r  s      r2   r`  z&Pool.imap_unordered.<locals>.<genexpr>  r  r:   )r#  r"  r  IMapUnorderedIteratorr  r  r   rI  r  r  r  r  s    `    @r2   imap_unorderedzPool.imap_unordered  sV   
 ;#F1MT5M>>*1D  F O2 2 2 2 2&x002 2 2"!   
 Mq====??49EEL*1D  F O6 6 6 6&|446 6 6"!   
 @?f????r:   c                    | j         t          k    rdS |	p| j        }	|
p| j        }
|p| j        }|	r*t
          #t          j        t          d                     d}	| j         t          k    r|| j	        n|}|r | j
        | j
                                         t          | j        |||||	|
|| j        | j        || j        r| j        nd|          }|
s|	r|                                  | j        r/| j                            t,          |j        d|||ffgdf           n&|                     t,          |j        d|||ff           |S dS )a  
        Asynchronous equivalent of `apply()` method.

        Callback is called when the functions return value is ready.
        The accept callback is called when the job is accepted to be executed.

        Simplified the flow is like this:

            >>> def apply_async(func, args, kwds, callback, accept_callback):
            ...     if accept_callback:
            ...         accept_callback()
            ...     retval = func(*args, **kwds)
            ...     if callback:
            ...         callback(retval)

        Nr  )r  r  callbacks_propagatesend_ackcorrelation_id)r#  r"  r  rI   r  r   r  r  r  r  r  rP   ApplyResultr  r  r  r  r  r  r  r  r   r   rq  r   )rR   rp  r8   r  ry  rz  accept_callbacktimeout_callbackwaitforslotr  rI   r  r  r  r   s                  r2   ro  zPool.apply_async  s   , ;#F#8t'8)T\1MT5M 	 ,4M+I      L;#+6+>$--KK (t}8%%''' X8Hg7J#2"&"8$7*.+?4-  F  ., .++---| O##tfk4$($.6 '7 &89=%? @ @ @ @ T4t'L MNNNM+ r:   c                     d S r-   ru   )rR   responser   r   fds        r2   r  zPool.send_ack  r   r:   c                     |                      |          \  }}|^	 t          ||pt                     d|_        d|_        d S # t
          $ r)}t          |          t          j        k    r Y d }~d S d }~ww xY wd S r  )	rd  r(  r	   r#  r)  rj  r   r  rk  )rR   r   sigr_  r   rz   s         r2   terminate_jobzPool.terminate_job  s    &&s++a,c3-+...
 04,'+$$$    S>>U[00 100000 s   A 
A6A11A6c                 @    |                      ||t          |||          S )z<
        Asynchronous equivalent of `map()` method.
        )rs  r9   rx  s         r2   r}  zPool.map_async	  s'    
 (GY.
 
 	
r:   c                   	 | j         t          k    rdS t          |d          st          |          }|<t	          t          |          t          | j                  dz            \  }}|r|dz  }t          |          dk    rd}t                              |||          }t          | j
        |t          |          ||          	| j                            	fdt          |          D             df           	S )zY
        Helper function to implement map, starmap and their async counterparts.
        N__len__r'   r   r   rz  c              3   F   K   | ]\  }}t           j        ||fi ffV  d S r-   r  )r^  r   r  mapperr   s      r2   r`  z"Pool._map_async.<locals>.<genexpr>&  sW       C C"&!Q  $fk1fqdB%GH C C C C C Cr:   )r#  r"  r   r5   divmodr  r  r  r  	MapResultr  r  r   rI  )
rR   rp  ru  r  rv  ry  rz  extrar  r   s
      `     @r2   rs  zPool._map_async  s+   
 ;#Fx++ 	&H~~H%c(mmS__q5HIIIu Q	x==AItXyAA4;	3x==(*8: : : C C C C C*3L*A*AC C CDHJ 	K 	K 	Kr:   c              #      K   t          |          }	 t          t          j        ||                    }|sd S | |fV  -r-   )rH  tupler<   islice)rp  itsizer  s       r2   r  zPool._get_tasks*  sO      "XX	i&r40011A )OOO		r:   c                      t          d          )Nz:pool objects cannot be passed between processes or pickled)r
  rQ   s    r2   r   zPool.__reduce__3  s    !H
 
 	
r:   c                 .   t          d           | j        t          k    rut          | _        | j        r| j                                         | j                                         | j        	                    d            t          | j                   d S d S )Nzclosing pool)r    r#  r"  r6  r  rg   r  r   r  r   rJ   rQ   s    r2   r   z
Pool.close8  s    n;#DK} &##%%% &&(((O%%% 455555 r:   c                     t          d           t          | _        | j                                         |                                  d S )Nzterminating pool)r    r3  r#  r  r4  r  rQ   s    r2   r4  zPool.terminateB  sC     !!!&&(((r:   c                 $    t          |            d S r-   )rJ   )task_handlers    r2   _stop_task_handlerzPool._stop_task_handlerH  s    L)))))r:   c                    | j         t          t          fv sJ t          d           t	          | j                   t          d           |                     | j                   t          d           t	          | j                   t          d           t          | j
                  D ]G\  }}t          d|dz   t          | j
                  |           |j        |                                 Ht          d           d S )Nzjoining worker handlerjoining task handlerjoining result handlerzresult handler joinedzjoining worker %s/%s (%r)r   zpool join complete)r#  r6  r3  r    rJ   r  r  r  r  rI  r  r  ry  r0  )rR   r   rR  s      r2   r0  z	Pool.joinL  s    {ui00000&'''D0111$%%% 2333&'''D0111%&&&dj)) 	 	DAq-q1uc$*ooqIIIx#"#####r:   c                 f    | j                                         D ]}|                                 d S r-   )r  r*  r  )rR   es     r2   restartzPool.restart[  s8    &&(( 	 	AEEGGGG	 	r:   c                 p   t          d           | j                                         |                                ru| j                                        r`| j                                         t          j        d           |                                r| j                                        Zd S d S d S d S )Nz7removing tasks from inqueue until task handler finishedr   )	r    _rlockrP   is_aliver   r  r   r   r   )inqueuer  r  s      r2   _help_stuff_finishzPool._help_stuff_finish_  s     	GHHH   ##%% 	'/*>*>*@*@ 	O  """JqMMM ##%% 	'/*>*>*@*@ 	 	 	 	 	 	 	 	 	r:   c                 0    |                     d            d S r-   )r   )clsrD  r:  s      r2   _set_result_sentinelzPool._set_result_sentinelh  s    Tr:   c                 6   t          d           |                                 |                                 |                    d            t          d            | j        |
  |                                 |                     ||           |	|	                                 |rRt          |d         d          r<t          d           |D ]*}|                                r|                                 +t          d           |                     |           t          d           |                                 |	)t          d           |	                    t                     |r}t          |d         d          rgt          d	           |D ]F}|
                                r0t          d
|j                   |j        |                                 Gt          d           |r|                                 |r|                                 d S d S )Nzfinalizing poolz&helping task handler/workers to finishr   r4  zterminating workersr  r  zjoining timeout handlerzjoining pool workerszcleaning up worker %dzpool workers joined)r    r4  r   r  r  r   r4  r  rG   TIMEOUT_MAXr  r   ry  r0  r   )r  rC  r  rD  r:  worker_handlerr  result_handlerrE  timeout_handlerhelp_stuff_finish_argsrR  s               r2   r  zPool._terminate_pooll  s1    	     """   d6777 677  """  4000&%%'''  	"GDG[11 	"'((( " ";;== "KKMMM$%%%|,,,&'''&+,,,  --- 	)GDG[11 	)())) ! !::<< !115999x+'((( 	MMOOO 	NN	 	r:   c                 $    d | j         D             S )Nc                 &    g | ]}|j         j        S ru   )ry  r   r%  s     r2   r"  z*Pool.process_sentinels.<locals>.<listcomp>  s    666a!666r:   )r  rQ   s    r2   process_sentinelszPool.process_sentinels  s    664:6666r:   )NNru   NNNNNr   NNNNTNFFFNNNFr  )r   r-   )NNNro   )Frp   rq   rr   rs   r  r   r8  rA  rU  r  r   rW   r  r  r  r  r  r   r  r  rd  r  r  r  r  r>  r5  r/  r1  r,  rE  rH  rL  rN  rS   r_   rP  rU  r[  rZ  ra  r>  rg  r  r  rq  r=   r{  r6   r  r  ro  r  r  r}  rs  staticmethodr  r   r   r4  r  r0  r  r  classmethodr  r  propertyr  ru   r:   r2   r  r    s         OFJK#N!M1BDCG%)56#!% $#'$!%&*!&!x
 x
 x
 x
t, , ,H H H
 
 
  = = =  8 8 8    3 3 3  4  Q Q Q Qf      3 3 3	 	 	           
G 
G 
G 
G     
  " " "K K K
/ / /( ( (  
) 
) 
)2 2 2  " < < < <A A A A 7;48= = = =C C C C@ @ @ @8 89+/@ @ @ @> &(b!$%)t!%t(*#'6 6 6 6p  
, 
, 
, 
, 3704
 
 
 
 <@15   0   \
 
 

6 6 6   * * \*$ $ $     \   [ 4 4 [4l 7 7 X7 7 7r:   r  c                       e Zd ZdZdZdZdddddedddddfdZd Zd Z	d Z
d Zd Zd	 Zd
 ZddZd ZddZddZd ZddZd Zd ZdS )r  Nru   c                    || _         t                      | _        t          j                    | _        t          t                    | _        || _	        || _
        || _        || _        || _        || _        || _        || _        |	| _        |
| _        |pd| _        || _        d| _        d| _        d | _        d | _        d | _        | || j        <   d S )Nru   F)r  r  _mutexrE   r  _eventrc  job_counterrq  r  	_callback_accept_callback_error_callback_timeout_callbackrp  r  r+  _on_timeout_set_on_timeout_cancel_callbacks_propagate	_send_ack	_accepted
_cancelledrh  r  _terminated)rR   rE  ry  r  r  rz  r  rI   r  r  r  r  r  r  s                 r2   rW   zApplyResult.__init__  s     -ffo''%%	! /-!1)$7!-"3$7$=2!!"dir:   c                     d                     | j        j        | j        | j        |                                           S )Nz&<{name}: {id} ack:{ack} ready:{ready}>)r  idackr  )r   r|   rp   rq  r  r  rQ   s    r2   r   zApplyResult.__repr__  s:    7>>(ydnDJJLL ? 
 
 	
r:   c                 4    | j                                         S r-   )r  r  rQ   s    r2   r  zApplyResult.ready  s    {!!###r:   c                     | j         S r-   )r  rQ   s    r2   acceptedzApplyResult.accepted  s
    ~r:   c                 <    |                                  sJ | j        S r-   )r  _successrQ   s    r2   
successfulzApplyResult.successful  s    zz|||}r:   c                     d| _         dS )zOnly works if synack is used.TN)r  rQ   s    r2   _cancelzApplyResult._cancel  s    r:   c                 F    | j                             | j        d            d S r-   )r  poprq  rQ   s    r2   discardzApplyResult.discard  s     	4(((((r:   c                     || _         d S r-   )r  rR   r   s     r2   r4  zApplyResult.terminate  s    !r:   c                     	 t          |pd           # t           $ r( |                     d dt                      f           Y d S w xY wNr   F)r   rJ  r   r  s     r2   r0  zApplyResult._set_terminated  s\    	6v{^,,, 	6 	6 	6IIdUMOO4555555	6s    .AAc                 $    | j         r| j         gng S r-   rh  rQ   s    r2   r  zApplyResult.worker_pids  s    %)%5= !!2=r:   c                 :    | j                             |           d S r-   )r  rz  r1  s     r2   rz  zApplyResult.wait  s    !!!!!r:   c                     |                      |           |                                 st          | j        r| j        S | j        j        r-   )rz  r  r   r  r]   	exceptionr1  s     r2   r  zApplyResult.get  sG    		'zz|| 	= 	(;+''r:   c                     |r?	  ||i | d S # | j         $ r  t          $ r}t          d|d           Y d }~d S d }~ww xY wd S )Nz"Pool callback raised exception: %rr   r   )r  r   rA   )rR   r   r8   rC   rz   s        r2   safe_apply_callbackzApplyResult.safe_apply_callback  s     	""T$V$$$$$,    " " ":C " " " " " " " " " ""	" 	"s    ?:?Fc                 n    | j         -|                     | j         ||r| j        n| j                   d S d S )N)rg  rI   )r  r  r  rp  )rR   rg  s     r2   ri  zApplyResult.handle_timeout  sT    !-$$&T.2E** %      .-r:   c                    | j         5  | j        r|                     |            |\  | _        | _        | j                                         | j        r | j                            | j	        d            | j
        r'| j        r |                     | j
        | j                   | j        .| j        r'| j        s |                     | j        | j                   d d d            d S # 1 swxY w Y   d S r-   )r  r  r  r]   r  r  r  r  r  rq  r  r  r  rR   r   r   s      r2   rJ  zApplyResult._set  sF   [ 	7 	7& .''---),&DM4;KOO~ 1 	4000 ~ 1$- 1((NDK1 1 1'( (15 (((($+7 7 7#	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   CC$$C(+C(c           	         | j         5  | j        rL| j        rEd| _        |r.|                     t          || j        |          cd d d            S 	 d d d            d S d| _        || _        || _        |                                 r | j	        
                    | j        d            | j        r!|                     | | j        | j                   t          }| j        r	 |                     ||           n(# | j        $ r	 t          } t"          $ r
 t          }Y nw xY w| j        r+|r)|                     ||| j        |          cd d d            S n<# | j        r/|r.|                     ||| j        |          c cY cd d d            S w w xY w| j        r|r|                     ||| j        |           d d d            d S # 1 swxY w Y   d S r  )r  r  r  r  r   rq  r  rh  r  r  r  r  r  rp  r   r  _propagate_errorsr   )rR   r   r  r   r   r  s         r2   r  zApplyResult._ack$  s
   [ 	C 	C 4> !% J>>$TYII		C 	C 	C 	C 	C 	C 	C 	C
 	C 	C 	C 	C 	C 	C 	C 	C "DN"/D"Dzz|| 1	4000# N$$T4+=t}MMMH$ ))#}====-   #H  $ $ $#HHH$ ~ ( #~~$c49h   5	C 	C 	C 	C 	C 	C 	C 	C2 ~ ( #~~$c49h       5	C 	C 	C 	C 	C 	C 	C 	C2  ~ C( CxdiBBB=	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Csf   9F=F=A?F=C32E3"DEDE%F=F=)F7F=F)F==GGr-   r  )rp   rq   rr   r!  r2  r3  r  rW   r   r  r  r  r  r  r4  r0  r  rz  r  r  ri  rJ  r  ru   r:   r2   r  r    sN       LIN8<"&t$3F $%'$ $       <
 
 
$ $ $      ) ) )" " "6 6 6 6> > >" " " "( ( ( (" " "   7 7 7*C C C C Cr:   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r  c                 ^   t                               | |||           d| _        || _        d g|z  | _        dg|z  | _        d g|z  | _        d g|z  | _        || _        |dk    r*d| _	        | j
                                         || j        = d S ||z  t          ||z            z   | _	        d S )Nr  TFr   )r  rW   r  _lengthr]   r  rh  r  
_chunksize_number_leftr  r  rq  r  )rR   rE  rv  lengthry  rz  s         r2   rW   zMapResult.__init__L  s    %. 	 	
 	
 	
 fvo6) 6F?#fvo#>> !DKOOdi    &) 3d6I;M6N6N NDr:   c                 0   |\  }}|r|| j         || j        z  |dz   | j        z  <   | xj        dz  c_        | j        dk    rc| j        r|                     | j                    | j        r | j                            | j        d            | j        	                                 d S d S d| _
        || _         | j        r|                     | j                    | j        r | j                            | j        d            | j        	                                 d S )Nr   r   F)r]   r  r  r  r  r  r  rq  r  r  r  r  )rR   r   success_resultsuccessr   s        r2   rJ  zMapResult._set^  s#   ( 	IODKDO+QUdo,EEF" A%%> 0NN4;///> 5KOODIt444!!!!! &% "DM DK# 2$$T[111~ 1	4000KOOr:   c                 (   || j         z  }t          |dz   | j         z  | j                  }t          ||          D ] }d| j        |<   || j        |<   || j        |<   !|                                 r"| j        	                    | j
        d            d S d S Nr   T)r  r  r  r   r  rh  r  r  r  r  rq  )rR   r   r  r   r8   r,  rG   js           r2   r  zMapResult._ackr  s    DO#AET_,dl;;ud## 	3 	3A $DN1"%DQ%2D""::<< 	-KOODIt,,,,,	- 	-r:   c                 *    t          | j                  S r-   )allr  rQ   s    r2   r  zMapResult.accepted|  s    4>"""r:   c                 $    d | j         D             S )Nc                     g | ]}||S ru   ru   )r^  r   s     r2   r"  z)MapResult.worker_pids.<locals>.<listcomp>  s    77737777r:   r  rQ   s    r2   r  zMapResult.worker_pids  s    77t/7777r:   N)rp   rq   rr   rW   rJ  r  r  r  ru   r:   r2   r  r  J  sb        O O O$  (- - -# # #8 8 8 8 8r:   r  c                   L    e Zd ZdZefdZd Zd
dZeZd Z	d Z
d Zd Zd	 ZdS )r  Nc                 (   t          j        t          j                              | _        t	          t
                    | _        || _        t                      | _	        d| _
        d | _        d| _        i | _        g | _        || _        | || j        <   d S r  )rE   	Conditionr  r\   rc  r  rq  r  r   _itemsrm  r  _ready	_unsorted_worker_pidsr+  )rR   rE  r  s      r2   rW   zIMapIterator.__init__  s{    ()9)9::
%%	gg$7!dir:   c                     | S r-   ru   rQ   s    r2   __iter__zIMapIterator.__iter__  rF  r:   c                    | j         5  	 | j                                        }n# t          $ r | j        | j        k    rd| _        t          | j                             |           	 | j                                        }n3# t          $ r& | j        | j        k    rd| _        t          t          w xY wY nw xY wd d d            n# 1 swxY w Y   |\  }}|r|S t          |          r  )r\   r  popleftrY  rm  r  r  r  rz  r   r   )rR   rI   r  r  rY   s        r2   rc  zIMapIterator.next  sH   Z 	' 	''{**,, ' ' ';$,.."&DK''
(((';..00DD! ' ' '{dl22&*++&&	' D'	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'   	LsJ   C$CAB7'B B70B11B74C6B77CC
C
c                 
   | j         5  | j        |k    r| j                            |           | xj        dz  c_        | j        | j        v rW| j                            | j                  }| j                            |           | xj        dz  c_        | j        | j        v W| j                                          n
|| j        |<   | j        | j        k    rd| _        | j	        | j
        = d d d            d S # 1 swxY w Y   d S r  )r\   rm  r  r  r  r  r^   r  r  r  rq  r   s      r2   rJ  zIMapIterator._set  sE   Z 	+ 	+{a""3'''q kT^33.,,T[99CK&&s+++KK1$KK kT^33 
!!####$'q!{dl**"K	*	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   C#C88C<?C<c                     | j         5  || _        | j        | j        k    r-d| _        | j                                          | j        | j        = d d d            d S # 1 swxY w Y   d S r  )r\   r  rm  r  r^   r  rq  )rR   r  s     r2   r  zIMapIterator._set_length  s    Z 	+ 	+!DL{dl**"
!!###K	*	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   AAA!Ac                 :    | j                             |           d S r-   )r  r  )rR   r   r  r   r8   s        r2   r  zIMapIterator._ack  s      %%%%%r:   c                     | j         S r-   )r  rQ   s    r2   r  zIMapIterator.ready  s
    {r:   c                     | j         S r-   )r  rQ   s    r2   r  zIMapIterator.worker_pids  s      r:   r-   )rp   rq   rr   r!  r  rW   r  rc  __next__rJ  r  r  r  r  ru   r:   r2   r  r    s        L2E             , H+ + +"+ + +& & &  ! ! ! ! !r:   r  c                       e Zd Zd ZdS )r  c                    | j         5  | j                            |           | xj        dz  c_        | j                                          | j        | j        k    rd| _        | j        | j        = d d d            d S # 1 swxY w Y   d S r  )	r\   r  r  rm  r^   r  r  r  rq  r   s      r2   rJ  zIMapUnorderedIterator._set  s    Z 	+ 	+Ks###KK1KKJ{dl**"K	*	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   A(A==BBN)rp   rq   rr   rJ  ru   r:   r2   r  r    s#        + + + + +r:   r  c                   B    e Zd ZddlmZ eZddZd Zed             Z	dS )	
ThreadPoolr   )r  Nru   c                 @    t                               | |||           d S r-   )r  rW   )rR   rW  r   r   s       r2   rW   zThreadPool.__init__  s     dI{H=====r:   c                      t                       _        t                       _         j        j         _         j        j         _         fd}| _        d S )Nc                 X    	 d                     |           fS # t          $ r Y dS w xY wr
  )r   r   rj  s    r2   r  z.ThreadPool._setup_queues.<locals>._poll_result  sC    #T__W_==== # # #"{{#s    
)))r   r  r  r   r   r  r   r  rl  s   ` r2   r  zThreadPool._setup_queues  sZ    -+.,	# 	# 	# 	# 	#
 )r:   c                     | j         5  | j                                         | j                            d gt	          |          z             | j                                          d d d            d S # 1 swxY w Y   d S r-   )	not_emptyqueuerg   extendr  ra   )r  r  r:  s      r2   r  zThreadPool._help_stuff_finish  s      	+ 	+M!!!M  $#d))!3444((***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   AA33A7:A7)NNru   )
rp   rq   rr   dummyr  r   rW   r  r  r  ru   r:   r2   r'  r'    si        ......G> > > >) ) ) + + \+ + +r:   r'  r-   )er  r  r<   r   r   r   r   rE   r   r  collectionsr   	functoolsr    r   r   r   commonr	   r
   r   r   r   compatr   r   r   r   r   r/  r   
exceptionsr   r   r   r   r   r   r   r   r-  r   r   r   r    r!   r   version_infort   system_winr$   r(  r{  r%   r  r.   	SemaphorerV   r"  r6  r3  r   r   r   r   r   r*   r   r   r.  r   r  r   r   countr  r  r3   r9   r>   rA   rJ   rL   r   rw   r   r   r   r  r8  rA  rU  r  r  r  r  r  r  r'  ru   r:   r2   <module>r;     sP         				   



                   $ $ $ $ $ $ $ $                    4 3 3 3 3 3 3 3 3 3                                                  * * * * * * * * * * 
qQ8?	!! 0/////GG      nG'KK   KKK v$JJ %J 		 		
 	


 769d33   GQ,/ )/2 ,io~    5 5 52 2 2   
4) 4) 4) 4) 4)* 4) 4) 4)v" " " " " " " ""' ' ' ' 'I ' ' '" " "z z z z z z z zD& & & & & & & &R"( "( "( "( "( "( "( "(JH H H H H* H H HV@ @ @ @ @Z @ @ @Fv' v' v' v' v'J v' v' v'rc7 c7 c7 c7 c7 c7 c7 c7TWC WC WC WC WC WC WC WC|68 68 68 68 68 68 68 68zK! K! K! K! K! K! K! K!d	+ 	+ 	+ 	+ 	+L 	+ 	+ 	+ + + + + + + + + + +s   C C C 