
    h                    :   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  SSKJrJr  SSKJr  SSKJrJrJrJrJr  SSKJrJrJr  SS	KJr  SS
KJr  SSK J!r!J"r"J#r#J$r$J%r%J&r&J'r'  S SKJ(r(  S SK)J*r*J+r+  SSKJ,r,J-r-J.r.  Sr/\R`                  S    S:H  r1\Rd                  " 5       S:X  a	  SSK3J4r5  \r6OS SKJ7r5  \Rl                  r6 \Rp                  r8\R`                  S:  a  \Rt                  r;O\Rv                  r;S r<Sr=Sr>S r?Sr@SrASrBSrCS rDSrESrF\G" \SS5      rHSrI\G" \SS 5      rDSrJSrK\R                  " 5       rM\R                  rNS rOS rPS  rQS! rRSBS" jrS " S# S$\;5      rT " S% S&\U5      rV " S' S(\U5      rWS) rX " S* S+5      rY " S, S-\5      rZ " S. S/\Z5      r[ " S0 S1\Z5      r\ " S2 S3\Z5      r] " S4 S5\Z5      r^ " S6 S75      r_ " S8 S95      r` " S: S;\`5      ra " S< S=5      rb " S> S?\b5      rc " S@ SA\_5      rdg! \9 a    Sr8 GN7f = f)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                      U R                   nUc  [        [         U R                  5       5      $ U$ ! [         a    S n N1f = fN)r   AttributeErrorr   fileno)
connectionnatives     5D:\TimeStamps\venv\Lib\site-packages\billiard/pool.py_get_send_offsetr3   x   sJ    '' ~{J$5$5$788M	  s   1 A A c                 $    [        [        U 6 5      $ r-   )listmapargss    r2   mapstarr9      s    T
    c                 N    [        [        R                  " U S   U S   5      5      $ )Nr   r   )r5   	itertoolsstarmapr7   s    r2   starmapstarr>      s"    	!!$q'47344r:   c                 V    [         R                  " 5       R                  " U /UQ70 UD6  g r-   )r   
get_loggererror)msgr8   kwargss      r2   rA   rA      s!    OOC1$1&1r:   c                 X    U [         R                  " 5       La  U R                  U5        g g r-   )	threadingcurrent_threadstop)threadtimeouts     r2   stop_if_not_currentrJ      s$    Y--//G 0r:   c                   j    \ rS rSrSrS r\(       a  SS jrS rS r	S r
SrgSS	 jrS
 rS r	S r
Srg)LaxBoundedSemaphore   zZSemaphore that checks that # release is <= # acquires,
but ignores if # releases >= value.c                 N    U =R                   S-  sl         U R                  5         g Nr   )_initial_valueacquireselfs    r2   shrinkLaxBoundedSemaphore.shrink   s    q r:   Nc                 :    [         R                  X5        Xl        g r-   
_Semaphore__init__rP   rS   valueverboses      r2   rY   LaxBoundedSemaphore.__init__   s    ,"'r:   c                     U R                      U =R                  S-  sl        U =R                  S-  sl        U R                   R                  5         S S S 5        g ! , (       d  f       g = frO   )_condrP   _valuenotifyrR   s    r2   growLaxBoundedSemaphore.grow   sB    ##q(#q 

!!# s   AA
A)c                     U R                   nU   U R                  U R                  :  a%  U =R                  S-  sl        UR                  5         S S S 5        g ! , (       d  f       g = frO   )r_   r`   rP   
notify_allrS   conds     r2   releaseLaxBoundedSemaphore.release   sB    ::D;;!4!44KK1$KOO%    A A
A&c                     U R                   U R                  :  a2  [        R                  U 5        U R                   U R                  :  a  M1  g g r-   )r`   rP   rX   rh   rR   s    r2   clearLaxBoundedSemaphore.clear   s6    ++ 3 33""4( ++ 3 33r:   c                 <    [         R                  XU5        Xl        g r-   rW   rZ   s      r2   rY   r]      s    W5"'r:   c                     U R                   nU   U =R                  S-  sl        U =R                  S-  sl        UR                  5         S S S 5        g ! , (       d  f       g = frO   )_Semaphore__condrP   _Semaphore__valuera   rf   s     r2   rb   rc      sE    ((D##q(#&&!+& s   ;A
A!c                     U R                   nU   U R                  U R                  :  a%  U =R                  S-  sl        UR                  5         S S S 5        g ! , (       d  f       g = frO   )rp   rq   rP   	notifyAllrf   s     r2   rh   ri      sI    ((D))D,?,??**a/*NN$ rj   c                     U R                   U R                  :  a2  [        R                  U 5        U R                   U R                  :  a  M1  g g r-   )rq   rP   rX   rh   rR   s    r2   rl   rm      s:    ((4+>+>>""4( ((4+>+>>r:   )rP   r   N)__name__
__module____qualname____firstlineno____doc__rT   PY3rY   rb   rh   rl   __static_attributes__ r:   r2   rL   rL      s9    + 	(	$	&	)
	(		%	)r:   rL   c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )MaybeEncodingError   zRWraps possible unpickleable errors, so they can be
safely sent through the socket.c                    > [        U5      U l        [        U5      U l        [        TU ]  U R                  U R                  5        g r-   )reprexcr[   superrY   )rS   r   r[   	__class__s      r2   rY   MaybeEncodingError.__init__   s0    9%[
4::.r:   c                 R    SU R                   R                  < S[        U 5      < S3$ )N<z: >)r   rv   strrR   s    r2   __repr__MaybeEncodingError.__repr__   s    !^^44c$i@@r:   c                 @    SU R                   < SU R                  < S3$ )NzError sending result: 'z'. Reason: 'z'.)r[   r   rR   s    r2   __str__MaybeEncodingError.__str__   s    JJ" 	"r:   )r   r[   )
rv   rw   rx   ry   rz   rY   r   r   r|   __classcell__r   s   @r2   r   r      s    '/
A" "r:   r   c                       \ rS rSrSrSrg)WorkersJoined   zAll workers have terminated.r}   N)rv   rw   rx   ry   rz   r|   r}   r:   r2   r   r      s    &r:   r   c                     [        5       er-   )r   )signumframes     r2   soft_timeout_sighandlerr      s    

!!r:   c                       \ rS rSr    SS jrS rS rS rSS jrS r	S	 r
\\S4S
 jrS rS rS r\4S jrS rSrg)Worker   Nc                     Ub  [        U5      [        :X  a  US:  d   eX@l        XPl        X`l        Xl        Xpl        Xl        Xl        XUsU l	        U l
        U l        Xl        Xl        U R                  U 5        g 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)rS   r   r   r   r   r   r   sentinelr   r   r   r   r   s                r2   rY   Worker.__init__   su     DNc$9hlKK&  $8!!*),D&$)TY, 0!!$'r:   c                 (   U R                   U R                  U R                  sUl         Ul        Ul        U R                   R                  R	                  5       Ul        U R                  R                  R	                  5       Ul        U R                  (       aw  U R                  R                  R	                  5       Ul        U R                  R                  R	                  5       Ul	        [        U R                  R                  5      Ul        OS =Ul        =Ul	        Ul        U R                   R                  R                  Ul        U R                  R                  R                  Ul        [        U R                   R                  5      Ul        U$ 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)rS   objs     r2   r   Worker.contribute_to_object   s
   &*hh		499#38hh&&--/yy((//19999,,335CL99,,335CL"24993D3D"ECAEECLE3<#*>))..**//.txx/?/?@
r:   c                 &   U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  44$ r-   )r   r   r   r   r   r   r   r   r   r   r   r   r   rR   s    r2   
__reduce__Worker.__reduce__  sn    ~~HHdiiD,<,<MM4==$..$,, 3 3T5N5N!!	 
 
 	
r:   c                   ^^ [         R                  mS /mSUU4S jjnU[         l        [        R                  " 5       nU R	                  5         U R                  5         U R                  US9   [         R                  " U R                  US95        U R                  UTS   S 5        g ! [         a+  n[        SXSS9  U R                  UTS   U5         S nANGS nAff = f! U R                  UTS   S 5        f = f)Nc                    > U TS'   T" U 5      $ r   r}   )status_exit	_exitcodes    r2   exitWorker.__call__.<locals>.exit  s    !IaL= 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)rS   r   r   r   r   r   s       @@r2   __call__Worker.__call__  s    F		! 	! iik  "s#	3HHT]]s]+,
 MM#y|T2	  	2-t1EMM#y|S11	2 MM#y|T2s*   /#B) )
C3!CC! CC! !C9c                    Uc  U(       a  [         O[        nU R                  b  U R                  X5        [        R                  S:w  aP   U R
                  R                  [        X445        [        R                  " S5        [        R                  " U5        g [        R                  " U5        g ! [        R                  " U5        f = f)Nwin32r   )
EX_FAILUREr*   r   r   platformr   putDEATHtimesleepr   r   )rS   r   exitcoder   s       r2   r   Worker._do_exit+  s    %(zeH<<#LL'<<7"#		uso67

1"HHX "s   
8B0 0Cc                     g r-   r}   rS   r   s     r2   r   Worker.on_loop_start;      r:   c                     U$ r-   r}   )rS   results     r2   prepare_resultWorker.prepare_result>  s    r:   c                   ^ ^ U=(       d    [         R                  " 5       nT R                  R                  nT R                  nT R
                  nT R                  nT R                  =(       d    SnT R                  n	T R                  n
T R                  mUU 4S jnSn Ub  U(       a  X:  a  U
" 5       nU(       a  Uu  pU[        :X  d   eUu  nnnnnU" [        UUU" 5       X6445        T(       a  U" U5      nU(       d  Md   SU	" U" U0 UD65      4n U" [        UUUU445        US-  nUS:  a[  ['        5       nUS::  a  [)        S5        US:  a:  UU:  a4  [+        [,        R/                  UU5      5        [0        T R3                  US9  $ Uc  M  U(       a  X:  a  M  U" SU5        U(       a!  X:X  a  [0        O[4         T R3                  US9  $ [6        T R3                  US9  $ ! [         a    S[        5       4n Nf = f! [         aa  n[         R"                  " 5       u    nn [%        UUS   5      n[        [$        UU45      nU" [        UUSU4U445        A S nAGN;! Af = fS nAff = f! T R3                  US9  f = f)	Nr   c                    > Sn US:  a.  [        SU TR                  R                  R                  5       SS9  T" 5       nU(       a  Uu  p4U[        :X  a  gU[
        :X  d   egUS-  nMe  )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_synrS   s        r2   wait_for_syn%Worker.workloop.<locals>.wait_for_synM  sp    Ar6Dtyy00779AG#o"%KE}$ C<'<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   r   r   rA   r!   MAXMEM_USED_FMTformat
EX_RECYCLE_ensure_messages_consumedr   r*   )rS   r    nowr   r   r   r   r   r   r   r   r   r   r   r   args_jobr   funr8   rC   confirmr   r   _tbwrappedeinfoused_kbr   s   `                            @r2   r   Worker.workloopA  s    RYY[iimm,,====#88=A,,(())	 	/	@"xI4H"n#&LE D=(=05-CCvsAsuc<=>$".s"3&$:"&sD7KF7K(L!M$US!VW$=>? NI+a/"))"a<!"KL"Q;75I+I#O$:$: ')=%? @#- **Y*?] "xI4HJ 19=%.%:z
J **Y*?  **Y*?C % :"'!9: % 	$#&<<>1b$&8fQi&HG$1 2GR3 %E  a%(I JK "	$: **Y*?s   A$I/ G% H &AI/ I/ I/  I/ I/ %G>;I/ =G>>I/ 
I,I'%5I!I'I/ !I$$I''I,,I/ /J c                     U R                   (       d  g[        [        5       HE  nU R                   R                  U:  a  [	        SU5          g[
        R                  " [        5        MG     [        S5        g)ziReturns 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_LIMITr[   r    r   r   ,GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVALr!   )rS   r   retrys      r2   r    Worker._ensure_messages_consumed  sb     $$DEE$$**i7BEJJJCD	 F
 	  	r:   c                 F   [        U R                  S5      (       a$  U R                  R                  R                  5         [        U R                  S5      (       a$  U R                  R
                  R                  5         U R                  b  U R                  " U R                  6   [        U R                  S9  [        b  [        R                  " [        [        5         [        R                  " [        R                  [        R                  5        g ! [         a     g f = f)Nr   r   )full)hasattrr   r   closer   r   r   r   r   r   SIG_SOFT_TIMEOUTsignalr   SIGINTSIG_IGNr.   rR   s    r2   r   Worker.after_fork  s    488Y''HH""$499i((II##%'dmm, 	4--. 'MM*,CD	MM&--8 		s   3D 
D D c                   ^^^ UR                   m[        US5      (       a]  UR                  R                  m[        US5      (       a,  UR                  (       a  UR                  m[
        4U4S jjnU$ UU4S jn U$ U4S jnU$ )Nr   get_payloadc                 "   > SU" T" 5       5      4$ NTr}   )rI   loadsr  s     r2   _recv'Worker._make_recv_method.<locals>._recv  s    {}!555r:   c                 2   > T" U 5      (       a	  ST" 5       4$ gNTFNr}   )rI   _pollgets    r2   r  r    s    W~~#SU{*&r:   c                 J   >  ST" U S94$ ! [         R                   a     gf = fNTrI   r!  r   )rI   r#  s    r2   r  r    s.    'W!555{{ '&'s    "")r#  r  r   pollr  r   )rS   connr  r"  r#  r  s      @@@r2   _make_recv_methodWorker._make_recv_method  so    hh4##LL%%Et]++0@0@"..)5 6 ' '
 r:   c                     U R                  U R                  5      U l        U R                  (       a!  U R                  U R                  5      U l        g S U l        g r-   )_make_protected_receiver   r   r   r   )rS   r  s     r2   r   Worker._make_child_methods  sD     88B $		 "99$))D/3 	r:   c                    ^^ U R                  U5      mU R                  (       a  U R                  R                  OS m[        4UU4S jjnU$ )Nc                   > T(       a#  T" 5       (       a  U " S5        [        [        5      e T" S5      u  pU(       d  g  Uc  U " S5        [        [        5      eU$ ! [        [        4 aR  n[	        U5      [
        R                  :X  a   S nAg U " S[        U5      R                  5        [        [        5      eS nAff = f)Nzworker got sentinel -- exiting      ?zworker got %s -- exiting)

SystemExitr*   EOFErrorIOErrorr   errnoEINTRr   rv   r   )r    readyr   r   _receiveshould_shutdowns       r2   receive/Worker._make_protected_receive.<locals>.receive  s    ?#4#467 ''-%c]
  {67 ,,J g& -S>U[[00$s)2D2DE ,,	-s   A B>,B9+B99B>)r)  r   is_setr    )rS   r(  r9  r7  r8  s      @@r2   r,  Worker._make_protected_receive  s>    ))$/37>>$..//t 	 	$ r:   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
NNr}   NNNTTNNr-   )rv   rw   rx   ry   rY   r   r   r   r   r   r   r    r   r   r   r   r)  r   r   r,  r|   r}   r:   r2   r   r      s`    HJ7;48=A("
3,  #	t K@Z ,. )5 5
r:   r   c                   P   ^  \ rS rSrS rS rU 4S jrS rS
S jrS r	S r
S	rU =r$ )
PoolThreadi  c                 b    [         R                  " U 5        [        U l        SU l        SU l        g NFT)r   rY   RUN_state_was_starteddaemon)rS   r8   rC   s      r2   rY   PoolThread.__init__  s&    d#!r:   c                     U R                  5       $ ! [         aa  n[        S[        U 5      R                  USS9  [        [        R                  " 5       [        5        [        R                  " 5          S nAg S nAf[         a?  n[        S[        U 5      R                  USS9  [        R                  " S5         S nAg S nAff = f)NzThread %r crashed: %rr   r   )bodyr   rA   r   rv   _killr   r   r	   r   r   r   r   rS   r   s     r2   runPoolThread.run  s    
	99;" 	)4:+>+>"))+{+HHJJ 	)4:+>+>HHQKK	s!    
CAA88C5B??Cc                 <   > SU l         [        [        U ]  " U0 UD6  g r  )rC  r   r>  start)rS   r8   rC   r   s      r2   rM  PoolThread.start  s     j$%t6v6r:   c                     g r-   r}   rR   s    r2   on_stop_not_startedPoolThread.on_stop_not_started  r   r:   c                 j    U R                   (       a  U R                  U5        g U R                  5         g r-   )rC  joinrP  rS   rI   s     r2   rG   PoolThread.stop
  s&    IIg  "r:   c                     [         U l        g r-   )	TERMINATErB  rR   s    r2   	terminatePoolThread.terminate  s	    r:   c                     [         U l        g r-   )CLOSErB  rR   s    r2   r  PoolThread.close  s	    r:   )rB  rC  rD  r-   )rv   rw   rx   ry   rY   rJ  rM  rP  rG   rX  r  r|   r   r   s   @r2   r>  r>    s+    7#  r:   r>  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )
Supervisori  c                 .   > Xl         [        TU ]	  5         g r-   )poolr   rY   )rS   r`  r   s     r2   rY   Supervisor.__init__  s    	r:   c                    [        S5        [        R                  " S5        U R                  n UR                  n[	        SUR
                  -  S5      Ul        [        S5       HU  nU R                  [        :X  d  M  UR                  [        :X  d  M/  UR                  5         [        R                  " S5        MW     X!l        U R                  [        :X  ad  UR                  [        :X  aP  UR                  5         [        R                  " S5        U R                  [        :X  a  UR                  [        :X  a  MP  [        S5        g ! [         a"    UR                  5         UR                  5         e f = f)Nzworker handler startingg?
   r   r+   zworker handler exiting)r    r   r   r`  r   
_processesr
  rB  rA  _maintain_poolr   r  rS  )rS   r`  
prev_stater  s       r2   rG  Supervisor.body  s   '(

3yy	 ++J!.rDOO/CQ!GD2Y;;#%$++*<'')JJsO  ",++$);##%

3 ++$); 	&'	 # 	JJLIIK	s   A
E =E B&E ,E3)r`  )rv   rw   rx   ry   rY   rG  r|   r   r   s   @r2   r^  r^    s    ( (r:   r^  c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )TaskHandleri<  c                 ^   > Xl         X l        X0l        X@l        XPl        [
        TU ]  5         g r-   )	taskqueuer   outqueuer`  cacher   rY   )rS   rk  r   rl  r`  rm  r   s         r2   rY   TaskHandler.__init__>  s'    " 	
r:   c           	      (   U R                   nU R                  nU R                  n[        UR                  S 5       Hd  u  pES nSn [        U5       H,  u  pvU R                  (       a  [        S5          O, U" U5        M.     U(       a  [        S5        U" US-   5        Md    O   [        S	5        U R                  5         g ! [         a    [        S5           M9  [         a<    US S u  p X   R                  U	S[        5       45         M  ! [         a      M  f = ff = f! [         ag    U(       a  US S OSu  pX;   a!  X   R                  U	S-   S[        5       45        U(       a%  [        R                  " S5        U" US-   5         GMQ   GMU  f = f)
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)rm  rk  r   iterr#  	enumeraterB  r    r3  r   _setr   KeyErrorr   tell_others)
rS   rm  rk  r   taskseq
set_lengthtaskr   r   inds
             r2   rG  TaskHandler.bodyF  sq   

NN	hh#'	t#<GDA&(1GA{{GH
!D	  2  "23"1q5)1 $=B -.3 # ;<$ !#'8!!JOOC%1IJ' ! !	!  &'+48<JOOC!Ge]_-EFJJ34q1u%% 	&sa   .D 4B?<!D ?DD D)D
D 

D	DD D	DD  A(FFc                 
   U R                   nU R                  nU R                  n [        S5        UR                  S 5        [        S5        U H  nU" S 5        M     [        S5        g ! [         a    [        S5         N#f = f)Nz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got IOError when sending sentinelsztask handler exiting)rl  r   r`  r    r3  )rS   rl  r   r`  ps        r2   ru  TaskHandler.tell_othersp  s{    ==hhyy
	ECDLL <=D	 
 	$%  	ECD	Es   8A* *BBc                 $    U R                  5         g r-   )ru  rR   s    r2   rP  TaskHandler.on_stop_not_started  s    r:   )rm  rl  r`  r   rk  )
rv   rw   rx   ry   rY   rG  ru  rP  r|   r   r   s   @r2   ri  ri  <  s    (T&& r:   ri  c                   R   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
rU =r$ )TimeoutHandleri  c                 `   > Xl         X l        X0l        X@l        S U l        [
        TU ]  5         g r-   )	processesrm  t_softt_hard_itr   rY   )rS   r  rm  r  r  r   s        r2   rY   TimeoutHandler.__init__  s)    "
r:   c                 V   ^ [        U4S j[        U R                  5       5       S5      $ )Nc              3   R   >#    U  H  u  pUR                   T:X  d  M  X!4v   M     g 7fr-   r   .0r   procr   s      r2   	<genexpr>1TimeoutHandler._process_by_pid.<locals>.<genexpr>  s)      
%>'!xx3 TI%>   '
'NN)nextrr  r  r   s    `r2   _process_by_pidTimeoutHandler._process_by_pid  s+     
%.t~~%>
  	r:   c                 $   [        SU5        U R                  UR                  5      u  p#U(       d  g UR                  SS9   [	        UR                  [
        5        g ! [         a(  n[        U5      [        R                  :w  a  e  S nAg S nAff = f)Nzsoft time limit exceeded for %rTsoft)
r    r  _worker_pidhandle_timeoutrH  r  OSErrorr   r4  ESRCH)rS   r   process_indexr   s        r2   on_soft_timeoutTimeoutHandler.on_soft_timeout  sx    /5..s? 	%	#//#34 	~, -	s   A 
B'B

Bc                 j   UR                  5       (       a  g [        SU5         [        UR                  5      e! [         a)    UR	                  UR
                  S[        5       45         Of = fU R                  UR                  5      u  p#UR                  SS9  U(       a  U R                  U5        g g )Nzhard time limit exceeded for %rFr  )r6  r    r   _timeoutrs  _jobr   r  r  r  _trywaitkill)rS   r   r  r  s       r2   on_hard_timeoutTimeoutHandler.on_hard_timeout  s    99;;/5	#CLL11  	9HHSXX}78	9 ..s? 	&g& s   9 0A,+A,c                 T   [        SUR                  5         [        R                  " UR                  5      UR                  :X  aZ  [        SUR                  5        [        R
                  " [        R                  " UR                  5      [        R                  5        OUR                  5         UR                  R                  SS9(       a  g  [        SUR                  5         [        R                  " UR                  5      UR                  :X  aZ  [        SUR                  5        [        R
                  " [        R                  " UR                  5      [        R                  5        g [        UR                  [        5        g ! [         a     Nf = f! [         a     g f = f)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  SIGTERMrX  _popenwaitr  SIGKILLrH  rS   workers     r2   r  TimeoutHandler._trywaitkill  s   +V\\:
	zz&**%3acicmcmn		"**VZZ0&..A  " }}!!#!. /?N	zz&**%3acicmcmn		"**VZZ0&..Afjj'*  		  		s+   BF
 'BF /F 

FF
F'&F'c              #   v  ^#    U R                   U R                  p![        5       nU R                  nU R                  nS nU R
                  [        :X  a  [        R                  " U R                  5      mU(       a  [        U4S jU 5       5      nTR                  5        Hy  u  pxUR                  n	UR                  n
U
c  Un
UR                  nUc  UnU" X5      (       a
  U" U5        MJ  Xs;  d  MQ  U" X5      (       d  M`  U" U5        UR                  U5        M{     S v   U R
                  [        :X  a  M  g g 7f)Nc                 D    U (       a  U(       d  g[        5       X-   :  a  gg r@  r   )rM  rI   s     r2   
_timed_out2TimeoutHandler.handle_timeouts.<locals>._timed_out  s    {eo- .r:   c              3   6   >#    U  H  oT;   d  M
  Uv   M     g 7fr-   r}   )r  krm  s     r2   r  1TimeoutHandler.handle_timeouts.<locals>.<genexpr>  s     ;u!U
AAu   		)r  r  setr  r  rB  rA  copyrm  items_time_accepted_soft_timeoutr  add)rS   r  r  dirtyr  r  r  r   r   ack_timesoft_timeouthard_timeoutrm  s               @r2   handle_timeoutsTimeoutHandler.handle_timeouts  s     dkk....	 kkS  IIdjj)E ;u;;++---"00'#)L"||'#)Lh55#C(^
8(J(J#C(IIaL ( / kkS s   C*D91D9 5D97D9c                     U R                   [        :X  aD   U R                  5        H  n[        R                  " S5        M     U R                   [        :X  a  MD  [        S5        g ! [
         a     M  f = f)Nr0  ztimeout handler exiting)rB  rA  r  r   r   r   r    rS   r  s     r2   rG  TimeoutHandler.body  s^    kkS --/AJJsO 0 kkS  	'(  s   -A% %
A32A3c                     U R                   c  U R                  5       U l          [        U R                   5        g ! [         a
    S U l          g f = fr-   )r  r  r  StopIterationrS   r8   s     r2   handle_eventTimeoutHandler.handle_event  sB    88++-DH	N 	DH	s   : AA)r  rm  r  r  r  )rv   rw   rx   ry   rY   r  r  r  r  r  rG  r  r|   r   r   s   @r2   r  r    s1    '*.$L) r:   r  c                   ^   ^  \ rS rSr S
U 4S jjrS rS rSS jrSS jrS r	SS jr
S	rU =r$ )ResultHandleri
  c                    > Xl         X l        X0l        X@l        XPl        X`l        Xpl        S U l        SU l        Xl	        Xl
        Xl        U R                  5         [        TU ]9  5         g )NF)rl  r#  rm  r'  join_exited_workersputlockr   r  _shutdown_completecheck_timeoutson_job_readyon_ready_counters_make_methodsr   rY   )rS   rl  r#  rm  r'  r  r  r   r  r  r  r   s              r2   rY   ResultHandler.__init__  sb     !
	#6 *"',(!2r:   c                 "    U R                  SS9  g )NT)r  )finish_at_shutdownrR   s    r2   rP  !ResultHandler.on_stop_not_started  s    5r:   c                    ^ ^^^^^	 T R                   mT R                  mT R                  mT R                  mUU4S jnUUUU 4S jnS n[        U[
        U[        U0=m	T l        U	4S jnUT l        g )Nc                 l   > STl          TU    R                  XX45        g ! [        [        4 a     g f = fr   )R_ackrt  r.   )r   r   time_acceptedr   r   rm  r   s        r2   on_ack+ResultHandler._make_methods.<locals>.on_ack(  s8    MOc
#@n- s     33c                   > Tb	  T" XX#5         TU    nT
R                  (       aw  [        [        UR	                  5       5      S 5      nU(       aM  UT
R                  ;   a=  T
R                  U   nUR                  5          U=R                  S-  sl        S S S 5        UR                  5       (       d  T	b  T	R                  5          UR                  X5        g ! [          a     g f = f! , (       d  f       NY= f! [          a     g f = frO   )
rt  r  r  rq  worker_pidsget_lockr[   r6  rh   rs  )r   r   r   r   item
worker_pidr   rm  r  r  rS   s          r2   on_ready-ResultHandler._make_methods.<locals>.on_ready0  s    'SS2Sz %%!$t'7'7'9":DA
*0F0F"F'+'='=j'I$)224(..!3. 5 ::<<&OO%		!!   54  s/   C >C'C8 
C$#C$'
C58
DDc                      [         R                  " U [        5        g ! [         a(  n[	        U5      [
        R                  :w  a  e  S nAg S nAff = fr-   )r   r%   r	   r  r   r4  r  )r   r   r   s      r2   on_death-ResultHandler._make_methods.<locals>.on_deathG  s=    [) S>U[[0 1s    
AAAc                 X   > U u  p TU   " U6   g ! [          a    [        SX5         g f = f)NzUnknown job state: %s (args=%s))rt  r    )rx  stater8   state_handlerss      r2   on_state_change4ResultHandler._make_methods.<locals>.on_state_changeR  s9    KEFu%t, F7EFs    )))	rm  r  r   r  r   r   r   r  r  )
rS   r  r  r  r  rm  r  r  r   r  s
   `    @@@@@r2   r  ResultHandler._make_methods"  so    

,,**((		 	.	 %0
 	
,	F  /r:   c              #     #    U R                   nU R                  n  U" U5      u  pEU R                  (       a+  U R                  [        :X  d   e[	        S5        [        5       eU(       a(  Uc  [	        S5        [        5       eU" U5        US:w  a  g Og S v   M}  ! [        [        4 a  n[	        SU5        [        5       eS nAff = f7f)N result handler got %r -- exitingz,result handler found thread._state=TERMINATEzresult handler got sentinelr   )r'  r  r3  r2  r    r   rB  rW  )rS   rI   r'  r  r6  rx  r   s          r2   _process_resultResultHandler._process_resultZ  s     yy..!"7m
 {{{{i///DEj <78"*$%a<   +  X& !8#>j !s(   C
B A2CC)B??CCc                     U R                   [        :X  a:  U R                  c  U R                  S5      U l         [	        U R                  5        g g ! [
        [        4 a
    S U l         g f = fr   )rB  rA  r  r  r  r  r   )rS   r/   eventss      r2   r  ResultHandler.handle_eventu  s\    ;;#xx//2 TXX	 
 "8,   s   A A*)A*c                    [        S5         U R                  [        :X  a/   U R                  S5       H  nM     U R                  [        :X  a  M/  U R                  5         g ! [         a     M  f = f! U R                  5         f = f)Nzresult handler startingr0  )r    rB  rA  r  r   r  r  s     r2   rG  ResultHandler.body~  sx    '(	&++$!11#6 7 ++$ ##%    ##%s-   A2 A! A2 !
A/+A2 .A//A2 2Bc           
         SU l         U R                  nU R                  nU R                  nU R                  nU R
                  nU R                  nU R                  nS n	U(       al  U R                  [        :w  aX  Ub  U" 5          U" S5      u  pU
(       a  Uc  [        S5        MG  U" U5         U" SS9  U(       a  U R                  [        :w  a  MX  [#        US
5      (       aG  [        S5         [%        S5       H+  nUR&                  R	                  5       (       d    OU" 5         M-      [        S[)        U5      U R                  5        g ! [        [        4 a  n[        SU5         S nAg S nAff = f! [         aS    [        5       nU	(       d  Un	 NX-
  S:  a  [        S5         M  [        S[        [!        X-
  S-
  S	5      5      5         GNf = f! [        [        4 a     Nf = f)NTr0  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 fullrc  z7result handler exiting: len(cache)=%s, thread._state=%s)r  r#  rl  rm  r'  r  r  r  rB  rW  r3  r2  r    r   r   absminr  r
  r   len)rS   r  r#  rl  rm  r'  r  r  r  time_terminater6  rx  r   r   r   s                  r2   r   ResultHandler.finish_at_shutdown  s   "&hh==

yy"66,,..y0) "3i
 <BC%C#T2! y0: 8Y''67rA#++0022E # 	G%j$++	'K X& 8#> ! 
Ck%%(N+c1AB +c#"6"<a@AC
C, X& sN   
E
 .E3 ..G G 
E0E++E03GG($GGG&%G&)r  r  rm  r  r#  r  r  r  r  rl  r'  r  r   r  r-   )r0  r  F)rv   rw   rx   ry   rY   rP  r  r  r  rG  r  r|   r   r   s   @r2   r  r  
  s3     BF$66/p6 
&6' 6'r:   r  c                   F   \ rS rSrSrSr\r\r\r\	r	\
r
\r                 S?S jrS rS rS	 rS
 rS rS rS rS rS rS rS rS rS@S jrS rS rS rS rS rS rS r S r!S r"SAS jr#SAS jr$S r%S  r&S! r'S" r(S# r)S$ r*S% r+S& r,S' r-S0 4S( jr.SBS) jr/  SCS* jr0SBS+ jr1SDS, jr2  SDS- jr3S0 SSSSSSSSSS4S. jr4S/ r5SBS0 jr6  SCS1 jr7  SCS2 jr8\9S3 5       r:S4 r;S5 r<S6 r=\9S7 5       r>S8 r?S9 r@\9S: 5       rA\BS; 5       rC\BS< 5       rD\ES= 5       rFS>rGg)EPooli  zK
Class which supports an async version of applying functions to arguments.
TNr}   c                    U=(       d
    [        5       U l        UU l        U R                  5         [	        5       U l        0 U l        [        U l        XPl	        X`l
        X@l        UU l        X l        X0l        UU l        U=(       d    [         U l        Xl        Xl        Xl        Xl        Xl        0 U l        UU l        [3        U=(       d#    U R                  S L=(       d    U R                  S L5      U l        U(       a(  [6        c!  [8        R:                  " [=        S5      5        S nUc  U R?                  5       OUU l         U=(       d    [C        U R@                  S-  5      U l"        [G        X=(       d    S5      U l#        Ub  [I        U5      (       d  [K        S5      eUb  [I        U5      (       d  [K        S5      eU R                  RL                  U l'        / U l(        0 U l)        0 U l*        UU l+        U=(       d    [Y        U R@                  5      U l-        []        U R@                  5       H  nU R_                  U5        M     U Ra                  U 5      U l1        U(       a  U Rb                  Re                  5         U Rg                  U R
                  U Rh                  U Rj                  U RP                  U R                  5      U l6        U(       a  U Rl                  Re                  5         S U l7        U R4                  (       a  U Rq                  U RP                  U R                  U R                  U R                  5      U l9        [u        5       U l;        SU l<        U R{                  5         U(       d  U Rr                  R|                  U l7        OS U l9        SU l<        S U l;        U R                  5       U l@        U R                  R|                  U lA        U(       a  U R                  Re                  5         [        X R                  U R
                  U R                  U Rj                  U RP                  U Rb                  U Rl                  U R                  U R                  U Rr                  U R                  5       4
SS9U lF        g )	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_cacherA  rB  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   rd  roundmax_restartsr   callable	TypeErrorProcess_Process_pool	_poolctrl_on_ready_countersputlocksrL   _putlockr
  _create_worker_processr^  _worker_handlerrM  ri  r   	_outqueue_task_handlerr  r  _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)rS   r  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   rY   Pool.__init__  s   $ ,{}	'(!1%9"'! /#6#M:M *.,!2*# *LL$*T) 
 ,4MM+I   L.7.?$..*Y(HE$//C2G,H*<9NQO"8K+@+@<==&x/H/H>??		))
"$ !I%8%It'A''* (  $t4  &&(!--doo.2oo.2nn.2jj.2kk	;
 $$&" $($7$7

DKK!!4<<%D! +/&D',1D)'') &*&;&;&H&H#$(D!,1D)*.D'  $99;#'#7#7#D#D   &&("&&//4==$..**d22D4F4F&&''..0	2
 
r:   c                 &    U R                   " U0 UD6$ r-   )r&  )rS   r8   kwdss      r2   r%  Pool.ProcessI  s    }}d+d++r:   c                 >    UR                  U R                  US95      $ )N)target)r   r%  r  s     r2   WorkerProcessPool.WorkerProcessL  s    **4<<v<+FGGr:   c                    U R                   " U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  4	SU R                  0UD6$ )Nr  )r  r.  r   r  _poll_result_join_exited_workersr+  r   r  r  r)  )rS   extra_kwargss     r2   r5  Pool.create_result_handlerO  ss    !!NNDOOT[[t88MM4--t/B/B	
 261H1H	

 
 	
r:   c                     g r-   r}   )rS   r   r   r   r   s        r2   r  Pool.on_job_readyX  r   r:   c                 H    U R                   U R                  U R                  4$ r-   )r9  r/  r'  rR   s    r2   r:  Pool._help_stuff_finish_args[  s    }}d00$**<<r:   c                 8     [        5       $ ! [         a     gf = frO   )r   NotImplementedErrorrR   s    r2   r   Pool.cpu_count^  s!    	;" 		s   	 
c                 4    U R                   R                  " U6 $ r-   )r6  r  r  s     r2   r7  Pool.handle_result_eventd  s    ##00$77r:   c                     g r-   r}   )rS   r  queuess      r2   _process_register_queuesPool._process_register_queuesg  r   r:   c                 V   ^ [        U4S j[        U R                  5       5       S5      $ )Nc              3   R   >#    U  H  u  pUR                   T:X  d  M  X!4v   M     g 7fr-   r   r  s      r2   r  'Pool._process_by_pid.<locals>.<genexpr>k  s)      
%:'!xx3 TI%:r  r  )r  rr  r'  r   s    `r2   r  Pool._process_by_pidj  s+     
%.tzz%:
  	r:   c                 4    U R                   U R                  S 4$ r-   )r9  r.  rR   s    r2   get_process_queuesPool.get_process_queuesp  s    }}dnnd22r:   c                    U R                   (       a  U R                  R                  5       OS nU R                  5       u  p4nU R                  R	                  S5      nU R                  U R                  X4XPR                  U R                  U R                  X R                  U R                  U R                  U R                  US95      nU R                  R                  U5        U R!                  XsXE45        UR"                  R%                  SS5      Ul        SUl        Xl        UR+                  5         X R,                  UR.                  '   X`R0                  UR.                  '   U R2                  (       a  U R3                  U5        U$ )Nr   )r   r   r   r   r%  
PoolWorkerT)r  r	  Eventr`  ValuerG  r   r  r  r  r  r  _wrap_exceptionr  r'  appendrY  namereplacerD  indexrM  r(  r   r)  r  )rS   r   r   r   r   r   r   ws           r2   r,  Pool._create_worker_processs  s1   (,(:(:499??$113499??3/t{{t..""H.C.C ,,//!%!;!;-  + 	 
 	 	

!%%at):;	<8		 (quu)9&q!r:   c                     g r-   r}   r  s     r2   process_flush_queuesPool.process_flush_queues  r   r:   c           	      ~  ^^ Sn[        U R                  R                  5       5       Vs/ s H/  nUR                  5       (       a  M  UR                  (       d  M-  UPM1     sn HI  nU=(       d
    [        5       nUR                  u  pEX$-
  UR                  :  d  M8  U R                  X55        MK     U(       a$  [        U R                  5      (       d
  [        5       e0 0 smn[        [        [        U R                  5      5      5       GH  nU R                  U   nUR                  n	UR                  n
U
b  U	c  M3  [        SU5        U
b  UR!                  5         [        SU5        UTUR"                  '   XUR"                  '   U	[$        [&        4;  a<  [)        USS5      (       d*  [+        SUR,                  UR"                  [/        U	5      SS9  U R1                  U5        U R                  U	 U R2                  UR"                  	 U R4                  UR"                  	 GM     T(       Ga  U R                   Vs/ s H  oR"                  PM     snm[        U R                  R                  5       5       GHR  n[7        UU4S	 jUR9                  5        5       S5      nU(       a  U R;                  X<5        UR                  5       (       dk  UR=                  U5      =(       d    Sn	TR=                  U5      nU(       a%  [)        US
S5      (       a  UR?                  U	5        M  U RA                  X<U	5        M  M  URB                  nURD                  nU(       a3  URG                  5       (       d  U R;                  X>R"                  5        GM  U(       d  GM  URG                  5       (       a  GM7  U R;                  X?R"                  5        GMU     TR                  5        H?  nU RH                  (       d  M  U(       d  U RK                  U5        U RI                  U5        MA     [        UR                  5       5      $ / $ s  snf s  snf )zCleanup after any worker processes which have exited due to
reaching their specified lifetime. Returns True if any workers were
cleaned up.
Nz!Supervisor: cleaning up worker %dzSupervisor: worked %d joined_controlled_terminationFz Process %r pid:%r exited with %rr   r   c              3   D   >#    U  H  nUT;   d  UT;  d  M  Uv   M     g 7fr-   r}   )r  r   all_pidscleaneds     r2   r  ,Pool._join_exited_workers.<locals>.<genexpr>  s(      ?$5Sw#X*= S$5s    	 _job_terminated)&r5   r  valuesr6  _worker_lostr   _lost_worker_timeoutmark_as_worker_lostr  r'  r   reversedr
  r   r  r    rS  r   r*   r   getattrrA   rh  r
   rn  r(  r)  r  r  on_job_process_downr#  _set_terminatedon_job_process_lost	_write_to_scheduled_for	_is_aliver  _process_cleanup_queues)rS   r  r   r   	lost_timelost_ret	exitcodesr   r  r   popenrk  acked_by_goner  write_to	sched_forrs  rt  s                   @@r2   rK  Pool._join_exited_workers  sI   
 
 $((:(:(<#= =#=C99; +.+;+; #= =C$C"%"2"2I!9!99((7= C

OO/!%DJJ01AZZ]FHMME} 491=$KKM4a8&,

#(0&**%E:#66#F,EuMM:VZZh1G!"
 ))&1JJqMNN6::.++FJJ7- 2. '+zz2z!z2HDKK..01 $?COO$5 ?! !,,S@99;;#,==#?#D1&{{=9GD2CU$K$K//9 44 #H '  #}}H # 2 2I(:(:(<(<00llC"9+>+>+@+@00mmD7 2: "..*'''#44V<((0	 +
 	((*++	O=F 3s   P5P5P55P:c                     g r-   r}   )rS   r   r  s      r2   on_partial_readPool.on_partial_read  r   r:   c                     g r-   r}   r  s     r2   r  Pool._process_cleanup_queues  r   r:   c                     g r-   r}   )rS   r   pid_gones      r2   r}  Pool.on_job_process_down  r   r:   c                 &    [        5       U4Ul        g r-   )r   rx  )rS   r   r   r   s       r2   r  Pool.on_job_process_lost  s    %K2r:   c                      [        SR                  [        U5      UR                  5      5      e! [          a    UR	                  S S[        5       45         g f = f)Nz(Worker exited prematurely: {0} Job: {1}.F)r   r   r
   r  rs  r   )rS   r   r   s      r2   rz  Pool.mark_as_worker_lost  sV    	!:AA *CHH6   	5HHTE=?34	5s   .0 &AAc                     U $ r-   r}   rR   s    r2   	__enter__Pool.__enter__      r:   c                 "    U R                  5       $ r-   )rX  )rS   r   s     r2   __exit__Pool.__exit__  s    ~~r:   c                     g r-   r}   rS   ns     r2   on_growPool.on_grow   r   r:   c                     g r-   r}   r  s     r2   	on_shrinkPool.on_shrink  r   r:   c                 2   [        U R                  5       5       Hp  u  p#U =R                  S-  sl        U R                  (       a  U R                  R	                  5         UR                  5         U R                  S5        X!S-
  :  d  Mp    g    [        S5      e)Nr   z&Can't shrink pool. All processes busy!)rr  _iterinactiverd  r+  rT   terminate_controlledr  
ValueError)rS   r  r   r  s       r2   rT   Pool.shrink  ss    "4#5#5#78IAOOq O}}$$&'')NN1Ez 9 EFFr:   c                     [        U5       HE  nU =R                  S-  sl        U R                  (       d  M+  U R                  R                  5         MG     U R	                  U5        g rO   )r
  rd  r+  rb   r  )rS   r  r   s      r2   rb   	Pool.grow  sD    qAOOq O}}}""$  	Qr:   c              #   j   #    U R                    H  nU R                  U5      (       a  M  Uv   M!     g 7fr-   )r'  _worker_activer  s     r2   r  Pool._iterinactive  s)     jjF&&v.. !s   $3	3c                     U R                   R                  5        H#  nUR                  UR                  5       ;   d  M#    g   g)NTF)r  rw  r   r  )rS   r  r   s      r2   r  Pool._worker_active  s4    ;;%%'CzzS__.. ( r:   c                    [        U R                  [        U R                  5      -
  5       Hw  nU R                  [
        :w  a    g U(       a,  X   [        [        4;  a  U R                  R                  5         U R                  U R                  5       5        [        S5        My     g! [         a    U R                  R                  5          NUf = f)zpBring the number of pool processes up to the specified number,
for use after reaping workers which have exited.
Nzadded worker)r
  rd  r  r'  rB  rA  r*   r   r   step
IndexErrorr,  _avail_indexr    )rS   r  r   s      r2   _repopulate_poolPool._repopulate_pool$  s     tTZZ89A{{c!*eZ5H!H&&++- ''(9(9(;<.! :  *""'')*s   3B(($CCc                    ^ [        U R                  5      U R                  :  d   e[        S U R                   5       5      m[	        U4S j[        U R                  5       5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7fr-   )rj  )r  r|  s     r2   r  $Pool._avail_index.<locals>.<genexpr>5  s     2z!ggzs   c              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7fr-   r}   )r  r   indicess     r2   r  r  6  s     J5!'9IAA5r  )r  r'  rd  r  r  r
  )rS   r  s    @r2   r  Pool._avail_index3  sK    4::0002tzz22JuT__5JJJr:   c                 ,    U R                  5       (       + $ r-   )rK  rR   s    r2   did_start_okPool.did_start_ok8  s    ,,...r:   c                     U R                  5       nU R                  U5        [        [        U5      5       H,  nU R                  c  M  U R                  R                  5         M.     g)zF"Clean up any exited workers and start replacements for them.
        N)rK  r  r
  r  r+  rh   )rS   joinedr   s      r2   re  Pool._maintain_pool;  sM     **,f%s6{#A}}(%%' $r:   c                 P   U R                   R                  [        :X  a'  U R                  [        :X  a   U R                  5         g g g ! [         a"    U R                  5         U R                  5         e [         a*  n[        U5      [        R                  :X  a  [        Uee S nAff = fr-   )r-  rB  rA  re  r   r  rS  r  r   r4  ENOMEMMemoryErrorrI  s     r2   maintain_poolPool.maintain_poolD  s    &&#-$++2D	##% 3E- ' 

		 S>U\\1%3.s   A 4B%;%B  B%c                 0  ^  T R                   R                  5       T l        T R                   R                  5       T l        T R                  R                  R
                  T l        T R                  R                  R                  T l	        U 4S jnUT l
        g )Nc                 ~   > TR                   R                  R                  U 5      (       a  STR                  5       4$ gr   )r.  r   r'  r   rI   rS   s    r2   rJ  (Pool._setup_queues.<locals>._poll_resultW  s3    ~~%%**733T__...r:   )r	  SimpleQueuer9  r.  r   r   r   r   r   r   rJ  rS   rJ  s   ` r2   r  Pool._setup_queuesQ  sh    		--/..0--//44..0055	 )r:   c                     U R                   (       aV  U R                  bH  U R                     U R                  (       d!  SU l        U R                  R	                  5         S S S 5        g g g ! , (       d  f       g = fr  )r  r0  r2  r3  rM  rR   s    r2   r4  Pool._start_timeout_handler]  sX     <<D11=,,4448D1))//1 -, ><,,s   3A))
A7c                 l    U R                   [        :X  a   U R                  XU5      R                  5       $ g)z(
Equivalent of `func(*args, **kwargs)`.
N)rB  rA  apply_asyncr#  )rS   funcr8   rC  s       r2   apply
Pool.applyf  s1     ;;###D599;; r:   c                 v    U R                   [        :X  a%  U R                  X[        U5      R	                  5       $ g)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)rB  rA  
_map_asyncr>   r#  rS   r  iterable	chunksizes       r2   r=   Pool.starmapm  s5     ;;#??4#.	;;>35A r:   c                 \    U R                   [        :X  a  U R                  X[        UXE5      $ g)z-
Asynchronous version of `starmap()` method.
N)rB  rA  r  r>   rS   r  r  r  callbackerror_callbacks         r2   starmap_asyncPool.starmap_asyncw  s/    
 ;;#??4;	#+= = r:   c                 l    U R                   [        :X  a   U R                  XU5      R                  5       $ g)z`
Apply `func` to each element in `iterable`, collecting the results
in a list that is returned.
N)rB  rA  	map_asyncr#  r  s       r2   r6   Pool.map  s/    
 ;;#>>$)<@@BB r:   c                   ^^ U R                   [        :w  a  gU=(       d    U R                  nUS:X  aQ  [        U R                  US9mU R
                  R                  UU4S j[        U5       5       TR                  45        T$ US:  d   e[        R                  TX#5      n[        U R                  US9mU R
                  R                  U4S j[        U5       5       TR                  45        S T 5       $ )z@
Equivalent of `map()` -- can be MUCH slower than `Pool.map()`.
Nr   r  c              3   X   >#    U  H  u  p[         TR                  UTU40 44v   M!     g 7fr-   r   r  r  r   xr  r   s      r2   r  Pool.imap.<locals>.<genexpr>  0      20TQ atR890   '*c              3   `   >#    U  H#  u  p[         TR                  U[        U40 44v   M%     g 7fr-   r   r  r9   r  r   r  r   s      r2   r  r    0      64TQ a1$;<4   +.c              3   6   #    U  H  o  H  o"v   M     M     g 7fr-   r}   r  chunkr  s      r2   r  r         ?fUDDf   )rB  rA  r  IMapIteratorr  r  r   rr  _set_lengthr  
_get_tasksrS   r  r  r  r  task_batchesr   s    `    @r2   imap	Pool.imap  s     ;;#1MT5M5M>!$++6IKFOO2&x02""! 
 Mq= =??4EL!$++6IKFOO6&|46""! 
 @f??r:   c                   ^^ U R                   [        :w  a  gU=(       d    U R                  nUS:X  aQ  [        U R                  US9mU R
                  R                  UU4S j[        U5       5       TR                  45        T$ US:  d   e[        R                  TX#5      n[        U R                  US9mU R
                  R                  U4S j[        U5       5       TR                  45        S T 5       $ )z<
Like `imap()` method but ordering of results is arbitrary.
Nr   r  c              3   X   >#    U  H  u  p[         TR                  UTU40 44v   M!     g 7fr-   r  r  s      r2   r  &Pool.imap_unordered.<locals>.<genexpr>  r  r  c              3   `   >#    U  H#  u  p[         TR                  U[        U40 44v   M%     g 7fr-   r  r  s      r2   r  r    r  r  c              3   6   #    U  H  o  H  o"v   M     M     g 7fr-   r}   r  s      r2   r  r    r  r  )rB  rA  r  IMapUnorderedIteratorr  r  r   rr  r  r  r  r  s    `    @r2   imap_unorderedPool.imap_unordered  s    
 ;;#1MT5M5M>*1DF OO2&x02""! 
 Mq= =??4EL*1DF OO6&|46""! 
 @f??r:   c                 `   U R                   [        :w  a  gU	=(       d    U R                  n	U
=(       d    U R                  n
U=(       d    U R                  nU	(       a(  [
        c!  [        R                  " [        S5      5        Sn	U R                   [        :X  Ga  Uc  U R                  OUnU(       a'  U R                  b  U R                  R                  5         [        U R                  XFUXYXU R                  U R                  UU R                   (       a  U R"                  OSUS9nU
(       d  U	(       a  U R%                  5         U R&                  (       a4  U R(                  R+                  [,        UR.                  SXU44/S45        U$ U R1                  [,        UR.                  SXU445        U$ g)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)rB  rA  r  rI   r  r  r  r  r   r*  r+  rQ   ApplyResultr  r  r  r
  r  r4  r  r  r   r   r  r   )rS   r  r8   rC  r  r  accept_callbacktimeout_callbackwaitforslotr  rI   r  r
  r  r   s                  r2   r  Pool.apply_async  si   , ;;##8t'8'8)T\\1MT5M5M,4MM+I   L;;#+6+>$--KKt}}8%%' X8Hg#22"&"8"8$7*.++4-F ,++-||##tfkk4$(.6 '7 &89=%? @ M T4t'L MNM+ r:   c                     g r-   r}   )rS   responser   r   fds        r2   r  Pool.send_ack  r   r:   c                     U R                  U5      u  p4Ub(   [        X=(       d    [        5        SUl        SUl        g g ! [
         a(  n[        U5      [        R                  :w  a  e  S nAg S nAff = fr  )	r  rH  r	   rq  rv  r  r   r4  r  )rS   r   sigr  r  r   s         r2   terminate_jobPool.terminate_job  sm    &&s+,c-+.
 04,'+$   S>U[[0 1s   A   
A2
A--A2c                 2    U R                  X[        X4U5      $ )z,
Asynchronous equivalent of `map()` method.
)r  r9   r  s         r2   r  Pool.map_async
  s    
 GY.
 	
r:   c                   ^^	 U R                   [        :w  a  g[        US5      (       d  [        U5      nUc9  [	        [        U5      [        U R                  5      S-  5      u  pGU(       a  US-  n[        U5      S:X  a  Sn[        R                  XU5      n[        U R                  U[        U5      UUS9m	U R                  R                  UU	4S j[        U5       5       S45        T	$ )zI
Helper function to implement map, starmap and their async counterparts.
N__len__r'   r   r   r  c              3   X   >#    U  H  u  p[         TR                  UTU40 44v   M!     g 7fr-   r  )r  r   r  mapperr   s      r2   r  "Pool._map_async.<locals>.<genexpr>'  s1      C*A$!  $fkk1fqdB%GH*Ar  )rB  rA  r  r5   divmodr  r'  r  r  	MapResultr  r  r   rr  )
rS   r  r  r   r  r  r  extrar  r   s
      `     @r2   r  Pool._map_async  s    
 ;;#x++H~H%c(mS_q5HIIQ	x=AItyA4;;	3x=(*8: C*3L*ACDHJ 	Kr:   c              #   ~   #    [        U5      n [        [        R                  " X5      5      nU(       d  g X4v   M.  7fr-   )rq  tupler<   islice)r  itsizer  s       r2   r  Pool._get_tasks+  s8     "Xi&&r01A)O	 s   ;=c                     [        S5      e)Nz:pool objects cannot be passed between processes or pickled)rS  rR   s    r2   r   Pool.__reduce__4  s    !H
 	
r:   c                 D   [        S5        U R                  [        :X  a  [        U l        U R                  (       a  U R                  R                  5         U R                  R                  5         U R                  R                  S 5        [        U R                  5        g g )Nzclosing pool)r    rB  rA  r[  r+  rl   r-  r  r  r   rJ   rR   s    r2   r  
Pool.close9  sk    n;;#DK}}##%  &&(OO% 4 45 r:   c                     [        S5        [        U l        U R                  R	                  5         U R                  5         g )Nzterminating pool)r    rW  rB  r-  rX  r;  rR   s    r2   rX  Pool.terminateC  s.     !&&(r:   c                     [        U 5        g r-   )rJ   )task_handlers    r2   _stop_task_handlerPool._stop_task_handlerI  s
    L)r:   c                    U R                   [        [        4;   d   e[        S5        [	        U R
                  5        [        S5        U R                  U R                  5        [        S5        [	        U R                  5        [        S5        [        U R                  5       HH  u  p[        SUS-   [        U R                  5      U5        UR                  c  M8  UR                  5         MJ     [        S5        g )Nzjoining worker handlerjoining task handlerjoining result handlerzresult handler joinedzjoining worker %s/%s (%r)r   zpool join complete)rB  r[  rW  r    rJ   r-  r4  r/  r6  rr  r'  r  r  rS  )rS   r   r|  s      r2   rS  	Pool.joinM  s    {{ui0000&'D001$% 2 23&'D001%&djj)DA-q1uc$**oqIxx# * 	"#r:   c                 f    U R                   R                  5        H  nUR                  5         M     g r-   )r(  rw  r  )rS   es     r2   restartPool.restart\  s"    &&(AEEG )r:   c                    [        S5        U R                  R                  5         UR                  5       (       a  U R                  R                  5       (       ah  U R                  R                  5         [        R                  " S5        UR                  5       (       a"  U R                  R                  5       (       a  Mf  g g g g )Nz7removing tasks from inqueue until task handler finishedr   )	r    _rlockrQ   is_aliver   r'  r   r   r   )inqueuer3  r'  s      r2   _help_stuff_finishPool._help_stuff_finish`  s     	GH ##%%'//*>*>*@*@OO  "JJqM ##%%'//*>*>*@*@%*@%r:   c                 &    UR                  S 5        g r-   )r   )clsrl  r`  s      r2   _set_result_sentinelPool._set_result_sentineli  s    Tr:   c                    [        S5        UR                  5         UR                  5         UR                  S 5        [        S5        U R                  " U
6   UR                  5         U R	                  X45        U	b  U	R                  5         U(       aO  [        US   S5      (       a;  [        S5        U H*  nUR                  5       (       d  M  UR                  5         M,     [        S5        U R                  U5        [        S5        UR                  5         U	b   [        S5        U	R                  [        5        U(       a  [        US   S5      (       ak  [        S	5        U HO  nUR                  5       (       d  M  [        S
UR                  5        UR                  c  M?  UR                  5         MQ     [        S5        U(       a  UR                  5         U(       a  UR                  5         g g )Nzfinalizing poolz&helping task handler/workers to finishr   rX  zterminating workersr7  r8  zjoining timeout handlerzjoining pool workerszcleaning up worker %dzpool workers joined)r    rX  r   rB  rF  r  r  r4  rG   TIMEOUT_MAXr@  r   r  rS  r  )rE  rk  rA  rl  r`  worker_handlerr3  result_handlerrm  timeout_handlerhelp_stuff_finish_argsr|  s               r2   r8  Pool._terminate_poolm  sx    	   " d67 67  "  0&%%' GDG[11'(;;==KKM  	$%|,&'&+,  -GDG[11()::<<11559xx+  '(MMONN r:   c                 l    U R                    Vs/ s H  oR                  R                  PM     sn$ s  snf r-   )r'  r  r   )rS   rk  s     r2   process_sentinelsPool.process_sentinels  s&    +/::6:a!!:666s   1),r&  r  r	  r  r  r9  r  r  r  r)  r.  rJ  r'  r(  rd  r+  r   r   r6  rB  r/  r  r;  r0  r2  r3  r-  r  r  r  r7  r  r"  r  r  r  r  r*  r  r   r  r
  r  rI   )NNr}   NNNNNr   NNNNTNFFFNNNFr  )r   r-   )NNNru   )Hrv   rw   rx   ry   rz   rf  r   r^  ri  r  r  r   rY   r%  rG  r5  r  r:  r   r7  rY  r  r`  r,  rn  rK  r  r  r}  r  rz  r  r  r  r  rT   rb   r  r  r  r  r  re  r  r  r4  r  r=   r  r6   r  r  r  r  r  r  r  staticmethodr  r   r  rX  r4  rS  r<  rB  classmethodrF  r8  propertyrP  r|   r}   r:   r2   r  r    s'    OFJK#N!M1BDCG%)56#!% $#'$!%&*!&!x
t,H
=834Qf3	 
G
"K
/(
)2  " <A 7;48=C@8 89+/@> &(b!$%)t!%t(*#'6p
, 3704
 <@150  

6 * *$     4 4l 7 7r:   r  c                       \ rS rSrSrSrSrSSSSS\SSSSS4S jrS r	S r
S rS rS	 rS
 rS rSS jrS rSS jrSS jrS rSS jrS rS rSrg)r  i  Nr}   c                    Xl         [        5       U l        [        R                  " 5       U l        [        [        5      U l        Xl	        X l
        X0l        XPl        X@l        Xpl        X`l        Xl        Xl        Xl        U=(       d    SU l        Xl        SU l        SU l        S U l        S U l        S U l        XU R                  '   g )Nr}   F)r  r1  _mutexrE   rd  _eventr  job_counterr  r  	_callback_accept_callback_error_callback_timeout_callbackr  r  ry  _on_timeout_set_on_timeout_cancel_callbacks_propagate	_send_ack	_accepted
_cancelledr  r  _terminated)rS   rm  r  r  r  r  r  rI   r  r  r  r
  r  r  s                 r2   rY   ApplyResult.__init__  s     -foo'%	! /-!1)$7!-"3$7$=2!!"diir:   c                     SR                  U R                  R                  U R                  U R                  U R                  5       S9$ )Nz&<{name}: {id} ack:{ack} ready:{ready}>)rh  idackr6  )r   r   rv   r  rb  r6  rR   s    r2   r   ApplyResult.__repr__  s<    7>>((yydnnDJJL ? 
 	
r:   c                 6    U R                   R                  5       $ r-   )rX  r;  rR   s    r2   r6  ApplyResult.ready  s    {{!!##r:   c                     U R                   $ r-   )rb  rR   s    r2   acceptedApplyResult.accepted  s    ~~r:   c                 H    U R                  5       (       d   eU R                  $ r-   )r6  _successrR   s    r2   
successfulApplyResult.successful  s    zz|||}}r:   c                     SU l         g)zOnly works if synack is used.TN)rc  rR   s    r2   _cancelApplyResult._cancel  s	    r:   c                 P    U R                   R                  U R                  S 5        g r-   )r  popr  rR   s    r2   discardApplyResult.discard  s    		4(r:   c                     Xl         g r-   )rd  rS   r   s     r2   rX  ApplyResult.terminate  s    !r:   c                      [        U=(       d    S* 5      e! [          a    U R                  S S[        5       45         g f = fNr   F)r   rs  r   r{  s     r2   r~  ApplyResult._set_terminated  s<    	6v{^,, 	6IIdUMO45	6s    &A A c                 B    U R                   (       a  U R                   /$ / $ r-   r  rR   s    r2   r  ApplyResult.worker_pids  s    %)%5%5  !=2=r:   c                 :    U R                   R                  U5        g r-   )rX  r  rT  s     r2   r  ApplyResult.wait  s    !r:   c                     U R                  U5        U R                  5       (       d  [        eU R                  (       a  U R                  $ U R                  R
                  er-   )r  r6  r   rp  r`   	exceptionrT  s     r2   r#  ApplyResult.get  s@    		'zz||==;;++'''r:   c                     U(       a
   U" U0 UD6  g g ! U R                    a    e [         a  n[        SUSS9   S nAg S nAff = f)Nz"Pool callback raised exception: %rr   r   )r`  r   rA   )rS   r  r8   rC   r   s        r2   safe_apply_callbackApplyResult.safe_apply_callback  sO    "T$V$  ,,  ":C ""s    A=Ac                     U R                   b9  U R                  U R                   UU(       a  U R                  OU R                  S9  g g )N)r  rI   )r]  r  r  r  )rS   r  s     r2   r  ApplyResult.handle_timeout	  sB    !!-$$&&T.2** %  .r:   c                    U R                      U R                  (       a  U R                  U 5        Uu  U l        U l        U R                  R                  5         U R                  (       a&  U R                  R                  U R                  S 5        U R                  (       a7  U R                  (       a&  U R                  U R                  U R                  5        U R                  bH  U R                  (       a7  U R                  (       d&  U R                  U R                  U R                  5        S S S 5        g ! , (       d  f       g = fr-   )rW  r_  rp  r`   rX  r  rb  r  rw  r  rZ  r  r\  rS   r   r   s      r2   rs  ApplyResult._set  s    [[&&''-),&DM4;KKOO~~ 		40 ~~$--((NNDKK1'(((((($++7# [[s   D D66
Ec           	      B   U R                      U R                  (       aS  U R                  (       aB  SU l        U(       a*  U R                  [        X0R
                  U5      sS S S 5        $  S S S 5        g SU l        X l        X0l        U R                  5       (       a&  U R                  R                  U R
                  S 5        U R                  (       a&  U R                  X R                  U R                  5        [        nU R                  (       aP   U R                  X25        U R                  (       a-  U(       a&  U R                  XSU R
                  U5      sS S S 5        $ U R                  (       a$  U(       a  U R                  XSU R
                  U5        S S S 5        g ! U R                    a    [        ne ["         a	    [        n Nf = f! U R                  (       a2  U(       a*  U R                  XSU R
                  U5      s  s sS S S 5        $ f f = f! , (       d  f       g = fr  )rW  rc  ra  rb  r   r  r  r  r6  r  rw  r^  r  r  r   r[  _propagate_errorsr   )rS   r   r  r   r   r  s         r2   r  ApplyResult._ack%  sz   [[4>>!%>>$YYI	 [
  [ "DN"/"zz||		40##$$T+=+=t}}MH$$))#= ~~(#~~$499h 5 [: ~~(xdiiB= [$ -- #H  $#H$ ~~(#~~$499h  5 [2 +3~3 [s[   AH(H2BHF 4H5H&GGGG8H HHH
H)r[  rb  r  rZ  r`  rc  r\  rX  r  ry  rW  r_  r^  ra  r  rp  rd  r  r  r]  r`   r  r  r-   r  )rv   rw   rx   ry   rx  r  r  r  rY   r   r6  rm  rq  rt  rx  rX  r~  r  r  r#  r  r  rs  r  r|   r}   r:   r2   r  r    s    LIN8<"&t$3F $%'$ $ <
$)"6>"("7*Cr:   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	r#  iK  c                 @   [         R                  XXES9  SU l        X0l        S /U-  U l        S/U-  U l        S /U-  U l        S /U-  U l        X l        US::  a.  SU l	        U R                  R                  5         XR                  	 g X2-  [        X2-  5      -   U l	        g )Nr  TFr   )r  rY   rp  _lengthr`   rb  r  r  
_chunksize_number_leftrX  r  r  r  )rS   rm  r  lengthr  r  s         r2   rY   MapResult.__init__M  s     	 	
 fvo6) 6F?#fvo#> !DKKOOii  & 3d6;M6N NDr:   c                    Uu  p4U(       a  X@R                   XR                  -  US-   U R                  -  & U =R                  S-  sl        U R                  S:X  a~  U R                  (       a  U R                  U R                   5        U R                  (       a&  U R
                  R                  U R                  S 5        U R                  R                  5         g g SU l
        X@l         U R                  (       a  U R                  U R                   5        U R                  (       a&  U R
                  R                  U R                  S 5        U R                  R                  5         g )Nr   r   F)r`   r  r  rZ  rb  r  rw  r  rX  r  rp  r\  )rS   r   success_resultsuccessr   s        r2   rs  MapResult._set_  s    (IOKKOO+QUdoo,EF"  A%>>NN4;;/>>KKOODIIt4! & "DM K##$$T[[1~~		40KKOOr:   c                 ^   XR                   -  n[        US-   U R                   -  U R                  5      n[        XV5       H.  nSU R                  U'   X0R
                  U'   X R                  U'   M0     U R                  5       (       a'  U R                  R                  U R                  S 5        g g Nr   T)r  r  r  r
  rb  r  r  r6  r  rw  r  )rS   r   r  r   r8   rM  rG   js           r2   r  MapResult._acks  s    OO#AET__,dll;u#A $DNN1"%Q%2" $ ::<<KKOODIIt, r:   c                 ,    [        U R                  5      $ r-   )allrb  rR   s    r2   rm  MapResult.accepted}  s    4>>""r:   c                 V    U R                    Vs/ s H  o(       d  M  UPM     sn$ s  snf r-   r  r   s     r2   r  MapResult.worker_pids  s$    #//7/3/777s   
&&)rb  r  r  r  rp  r  r`   r  N)
rv   rw   rx   ry   rY   rs  r  rm  r  r|   r}   r:   r2   r#  r#  K  s    O$(-#8r:   r#  c                   V    \ rS rSrSr\4S jrS rSS jr\r	S r
S rS rS	 rS
 rSrg)r  i  Nc                     [         R                  " [         R                  " 5       5      U l        [	        [
        5      U l        Xl        [        5       U l	        SU l
        S U l        SU l        0 U l        / U l        X l        XU R                  '   g r~  )rE   	Conditionr1  r_   r  rY  r  r  r   _itemsr  r  _ready	_unsorted_worker_pidsry  )rS   rm  r  s      r2   rY   IMapIterator.__init__  sk    (()9:
%	g$7!diir:   c                     U $ r-   r}   rR   s    r2   __iter__IMapIterator.__iter__  r  r:   c                    U R                       U R                  R                  5       nS S S 5        Wu  p4U(       a  U$ [        U5      e! [         a    U R                  U R
                  :X  a  SU l        [        eU R                   R                  U5         U R                  R                  5       n N! [         a.    U R                  U R
                  :X  a  SU l        [        e[        ef = ff = f! , (       d  f       N= fr  )r_   r  popleftr  r  r  r  r  r  r   r   )rS   rI   r  r  r[   s        r2   r  IMapIterator.next  s    ZZ'{{**,   L!  ';;$,,."&DK''

(';;..0D! '{{dll2&*++&&	'' Zs5   C1A		AC.B20C128C**C..C11
C?c                    U R                      U R                  U:X  a  U R                  R                  U5        U =R                  S-  sl        U R                  U R                  ;   aq  U R                  R                  U R                  5      nU R                  R                  U5        U =R                  S-  sl        U R                  U R                  ;   a  Mq  U R                   R                  5         OX R                  U'   U R                  U R                  :X  a  SU l        U R                  U R                  	 S S S 5        g ! , (       d  f       g = fr  )r_   r  r  rg  r  rw  ra   r  r  r  r  r  s      r2   rs  IMapIterator._set  s    ZZ{{a""3'q kkT^^3..,,T[[9CKK&&s+KK1$K kkT^^3 

!!#$'q!{{dll*"KK		* ZZs   C
EA!E
Ec                     U R                      Xl        U R                  U R                  :X  a8  SU l        U R                   R	                  5         U R
                  U R                  	 S S S 5        g ! , (       d  f       g = fr  )r_   r  r  r  ra   r  r  )rS   r  s     r2   r  IMapIterator._set_length  sO    ZZ!L{{dll*"

!!#KK		* ZZs   AA//
A=c                 :    U R                   R                  U5        g r-   )r  rg  )rS   r   r  r   r8   s        r2   r  IMapIterator._ack  s      %r:   c                     U R                   $ r-   r  rR   s    r2   r6  IMapIterator.ready  s    {{r:   c                     U R                   $ r-   )r  rR   s    r2   r  IMapIterator.worker_pids  s       r:   )
r  r_   r  r  r  r  ry  r  r  r  r-   )rv   rw   rx   ry   rx  r  rY   r  r  __next__rs  r  r  r6  r  r|   r}   r:   r2   r  r    s9    L2E  , H+"+&!r:   r  c                       \ rS rSrS rSrg)r  i  c                 T   U R                      U R                  R                  U5        U =R                  S-  sl        U R                   R	                  5         U R                  U R
                  :X  a  SU l        U R                  U R                  	 S S S 5        g ! , (       d  f       g = fr  )	r_   r  rg  r  ra   r  r  r  r  r  s      r2   rs  IMapUnorderedIterator._set  sj    ZZKKs#KK1KJJ{{dll*"KK		* ZZs   BB
B'r  N)rv   rw   rx   ry   rs  r|   r}   r:   r2   r  r    s    +r:   r  c                   D    \ rS rSrSSKJr  \rS	S jrS r\	S 5       r
Srg)

ThreadPooli  r   )r%  Nc                 0    [         R                  XX#5        g r-   )r  rY   )rS   r  r   r   s       r2   rY   ThreadPool.__init__  s    d{=r:   c                    ^  [        5       T l        [        5       T l        T R                  R                  T l        T R                  R
                  T l        U 4S jnUT l        g )Nc                 H   >  STR                  U S94$ ! [         a     gf = fr%  )r   r   r  s    r2   rJ  .ThreadPool._setup_queues.<locals>._poll_result  s0    #T__W_=== #"#s    
!!)r   r9  r.  r   r   r#  r   rJ  r  s   ` r2   r  ThreadPool._setup_queues  sF    --++..,,	#
 )r:   c                    U R                      U R                  R                  5         U R                  R                  S /[	        U5      -  5        U R                   R                  5         S S S 5        g ! , (       d  f       g = fr-   )	not_emptyqueuerl   extendr  re   )rA  r3  r`  s      r2   rB  ThreadPool._help_stuff_finish  sX     MM!MM  $#d)!34((* s   AA33
B)r9  r.  rJ  r   r   )NNr}   )rv   rw   rx   ry   dummyr%  r   rY   r  rR  rB  r|   r}   r:   r2   r  r    s(    .G>) + +r:   r  r-   )er  r4  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_infor{   system_winr$   rH  r  r%   rI  r.   	SemaphorerX   rA  r[  rW  r   r   r   r   r   r*   r   r   r|  r  r  r  r  countrY  r1  r3   r9   r>   rA   rJ   rL   r   r   r   r   r   r>  r^  ri  r  r  r  r  r#  r  r  r  r}   r:   r2   <module>r     sb      	   
      $   4 3        * * 
qQ??	! 0G nnG''K
 v$$J %%J 		 		
 	


 69d3   GQ,/ )/2 ,oo~~52
4)* 4)v" ""'I '"{ {F& &R"( "(JH* HV@Z @Fv'J v'rc7 c7TWC WC|68 68zK! K!d	+L 	+ + +O=  Ks   H HH