
    z%iG                         	 d Z ddlZddlmZ ddlZddlZddlZddlm	Z	 ddl
Z
ddlZddlmZ ddlZddlZddlmZ  ej$                         Zda G d d	      Zd
 Z e
j.                  e       dZdZ G d de      Z G d d      Zd Z G d de      Z G d de      Z  G d de      Z! G d de	      Z"d Z#d Z$	 	 d&dZ%d'dZ& G d de
jN                        Z(da)da*d  Z+d! Z, G d" d#ejZ                        Z. G d$ d%ej^                        Z0y)(z"Brian Quinlan (brian@sweetapp.com)    N)_base)Queue)partial)format_exceptionFc                   $    e Zd Zd Zd Zd Zd Zy)_ThreadWakeupc                 X    d| _         t        j                  d      \  | _        | _        y )NF)duplex)_closedmpPipe_reader_writerselfs    N/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/concurrent/futures/process.py__init__z_ThreadWakeup.__init__E   s     %'WWE%:"dl    c                     | j                   s<d| _         | j                  j                          | j                  j                          y y NT)r   r   closer   r   s    r   r   z_ThreadWakeup.closeI   s5    ||DLLL LL  r   c                 T    | j                   s| j                  j                  d       y y )Nr   )r   r   
send_bytesr   s    r   wakeupz_ThreadWakeup.wakeupO   s     ||LL##C( r   c                     | j                   sQ| j                  j                         r6| j                  j                          | j                  j                         r5y y y N)r   r   poll
recv_bytesr   s    r   clearz_ThreadWakeup.clearS   s@    ||,,##%'') ,,##% r   N)__name__
__module____qualname__r   r   r   r    r   r   r   r   D   s    ;!)*r   r   c                      da t        t        j                               } | D ]  \  }}|j	                           | D ]  \  }}|j                           y r   )_global_shutdownlist_threads_wakeupsitemsr   join)r(   _thread_wakeupts       r   _python_exitr-   Y   sZ    !'')*E! =  1	r      =   c                       e Zd Zd Zd Zy)_RemoteTracebackc                     || _         y r   tb)r   r4   s     r   r   z_RemoteTraceback.__init__y   s	    r   c                     | j                   S r   r3   r   s    r   __str__z_RemoteTraceback.__str__{   s    wwr   N)r    r!   r"   r   r6   r#   r   r   r1   r1   x   s    r   r1   c                       e Zd Zd Zd Zy)_ExceptionWithTracebackc                     dj                  t        t        |      ||            }|| _        d | j                  _        d|z  | _        y )N z

"""
%s""")r)   r   typeexc__traceback__r4   )r   r<   r4   s      r   r   z _ExceptionWithTraceback.__init__   s?    WW%d3ib9: "& 2%r   c                 >    t         | j                  | j                  ffS r   )_rebuild_excr<   r4   r   s    r   
__reduce__z"_ExceptionWithTraceback.__reduce__   s    dhh000r   N)r    r!   r"   r   r@   r#   r   r   r8   r8   ~   s    &1r   r8   c                 &    t        |      | _        | S r   )r1   	__cause__)r<   r4   s     r   r?   r?      s    $R(CMJr   c                       e Zd Zd Zy)	_WorkItemc                 <    || _         || _        || _        || _        y r   )futurefnargskwargs)r   rF   rG   rH   rI   s        r   r   z_WorkItem.__init__   s    	r   Nr    r!   r"   r   r#   r   r   rD   rD          r   rD   c                       e Zd ZddZy)_ResultItemNc                 <    || _         || _        || _        || _        y r   )work_id	exceptionresultexit_pid)r   rO   rP   rQ   rR   s        r   r   z_ResultItem.__init__   s    " r   NNNrJ   r#   r   r   rM   rM      s    !r   rM   c                       e Zd Zd Zy)	_CallItemc                 <    || _         || _        || _        || _        y r   )rO   rG   rH   rI   )r   rO   rG   rH   rI   s        r   r   z_CallItem.__init__   s    	r   NrJ   r#   r   r   rU   rU      rK   r   rU   c                   ,     e Zd Z	 d fd	Z fdZ xZS )
_SafeQueuec                R    || _         || _        || _        t        |   ||       y )N)ctx)pending_work_itemsshutdown_lockr+   superr   )r   max_sizerZ   r[   r\   r+   	__class__s         r   r   z_SafeQueue.__init__   s-    "4**s+r   c                    t        |t              rt        t        |      ||j                        }t        dj                  dj                  |                  |_        | j                  j                  |j                  d       }| j                  5  | j                  j                          d d d        ||j                  j!                  |       y y t"        | I  ||       y # 1 sw Y   9xY w)Nz

"""
{}"""r:   )
isinstancerU   r   r;   r=   r1   formatr)   rB   r[   poprO   r\   r+   r   rF   set_exceptionr]   _on_queue_feeder_error)r   eobjr4   	work_itemr_   s        r   re   z!_SafeQueue._on_queue_feeder_error   s    c9%!$q'1aoo>B*>+@+@+MNAK//33CKKFI## ,""))+,
 $  ..q1 % G*1c2, ,s   C%%C.)r   )r    r!   r"   r   re   __classcell__r_   s   @r   rX   rX      s    G,3 3r   rX   c              '   l   K   	 t        | }	 t        t        j                  ||             }|sy | 'wr   )ziptuple	itertoolsislice)	chunksize	iterablesitchunks       r   _get_chunksrt      s<     6	iB
i&&r956	 s   24c                 4    	 |D cg c]  } | | 	 c}S c c}w r   r#   )rG   rs   rH   s      r   _process_chunkrv      s!     #(($BI(((s   c                     	 	 | j                  t        ||||             y # t        $ r=}t        ||j                        }| j                  t        |||             Y d }~y d }~ww xY w)N)rQ   rP   rR   rP   rR   )putrM   BaseExceptionr8   r=   )result_queuerO   rQ   rP   rR   rf   r<   s          r   _sendback_resultr|      sk    89WV/88M 	N 9%a9W.68 	9 	99s   " 	A(3A##A(c                 D   	 |	  ||  d}d }	 | j	                  d      }|$|j                  t        j                                y ||dz  }||k\  rt        j                         }	  |j                  |j                  i |j                  }t        ||j                  ||       ~~|y # t         $ r$ t        j                  j                  dd       Y y w xY w# t         $ r9}	t        |	|	j                        }
t        ||j                  |
|       Y d }	~	rd }	~	ww xY w)	NzException in initializer:T)exc_infor   blockr.   )rQ   rR   rx   )rz   r   LOGGERcriticalgetry   osgetpidrG   rH   rI   r|   rO   r8   r=   )
call_queuer{   initializerinitargs	max_tasks	num_tasksrR   	call_itemrrf   r<   s              r   _process_workerr      s8    	" IH
NNN.	RYY[) NII%99;			innA	0@0@AA \9+<+<Q&.0 9   	LL!!"=!M 		*  	0)!Q__=C\9+<+<&.0 0	0s)   B- (&C -*CC	D&/DDc                   \     e Zd Z	  fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )_ExecutorManagerThreadc                    |j                   | _        |j                  | _        | j                  | j                  fd}t	        j
                  ||      | _        |j                  | _        |j                  | _
        |j                  | _        |j                  | _        |j                  | _        |j"                  | _        t&        | Q          y )Nc                     t         j                  j                  d       |5  |j                          d d d        y # 1 sw Y   y xY w)Nz?Executor collected: triggering callback for QueueManager wakeup)r   utildebugr   )r*   r+   r\   s      r   
weakref_cbz3_ExecutorManagerThread.__init__.<locals>.weakref_cb.  s=     GGMM 1 2 '$$&' ' 's	   <A)_executor_manager_thread_wakeupr+   _shutdown_lockr\   weakrefrefexecutor_reference
_processes	processes_call_queuer   _result_queuer{   	_work_idswork_ids_queue_max_tasks_per_childmax_tasks_per_child_pending_work_itemsr[   r]   r   )r   executorr   r_   s      r   r   z_ExecutorManagerThread.__init__   s    
 &EE%44 &*%7%7%)%7%7	' #*++h
"C ",, #.. %22 '00 $,#@#@  #+">">r   c                    	 | j                          | j                         \  }}}|r| j                  |       y || j                  |       |j                  d u}|r5| j
                  j                  |j                        }|j                          ~| j                         x}rC|r&| j                  5  |j                          d d d        n|j                  j                          ~| j                         r=| j                          | j                          | j                  s| j!                          y 5# 1 sw Y   YxY wr   )add_call_item_to_queuewait_result_broken_or_wakeupterminate_brokenprocess_result_itemrR   r   rc   r)   r   r\   _adjust_process_count_idle_worker_semaphorereleaseis_shutting_downflag_executor_shutting_downr[   join_executor_internals)r   result_item	is_brokencauseprocess_exitedpr   s          r   runz_ExecutorManagerThread.runO  s.    ''),0,M,M,O)KE%%e,&((5!,!5!5T!A!**;+?+?@AFFH  #668888%!// =$::<= = !77??A $$&002
 ++- ..002Q ,= =s   3D77E c                    	 | j                   j                         ry 	 | j                  j                  d      }| j                  |   }|j
                  j                         rH| j                   j                  t        ||j                  |j                  |j                        d       n| j                  |= # t        j                  $ r Y y w xY w)NTFr   )r   fullr   r   r[   rF   set_running_or_notify_cancelry   rU   rG   rH   rI   queueEmpty)r   rO   rh   s      r   r   z-_ExecutorManagerThread.add_call_item_to_queue|  s     ##%--111> !33G<	##@@BOO''	'2;,,2;..2;2B2B)D /3	 ( 4 //8% 
 ;; s   B: :CCc                 X   | j                   j                  }| j                  j                  }||g}t        | j                  j                               D cg c]  }|j                   }}t        j                  j                  ||z         }d }d}d }	||v r	 |j                         }	d}n||v rd}| j                  5  | j                  j!                          d d d        |	||fS c c}w # t        $ r*}
t        t        |
      |
|
j                        }Y d }
~
gd }
~
ww xY w# 1 sw Y   IxY wNTF)r{   r   r+   r&   r   valuessentinelr   
connectionwaitrecvrz   r   r;   r=   r\   r   )r   result_readerwakeup_readerreadersr   worker_sentinelsreadyr   r   r   rf   s              r   r   z3_ExecutorManagerThread.wait_result_broken_or_wakeup  s"    ))11**22 -004T^^5J5J5L0MN1AJJNN""7-=#=>	E!F+002!	 e#I 	'$$&	' Iu,,' O ! F(a!Q__EF	' 	's*   C%C* =D *	D3 DD D)c                    t        |t              rI| j                  j                  |      }|j	                          | j                  s| j                          y y | j                  j                  |j                  d       }|X|j                  r&|j                  j                  |j                         y |j                  j                  |j                         y y r   )ra   intr   rc   r)   r   r[   rO   rP   rF   rd   
set_resultrQ   )r   r   r   rh   s       r   r   z*_ExecutorManagerThread.process_result_item  s     k3' "";/AFFH>>,,. "
 //33K4G4GNI$(($$22;3H3HI$$//0B0BC	 %r   c                 V    | j                         }t        xs |d u xs |j                  S r   )r   r%   _shutdown_thread)r   r   s     r   r   z'_ExecutorManagerThread.is_shutting_down  s4    **,
 ! -H$4 -,,	.r   c                    | j                         }|d|_        d|_        d }t        d      }|#t	        ddj                  |       d      |_        | j                  j                         D ]!  \  }}|j                  j                  |       ~# | j                  j                          | j                  j                         D ]  }|j                           | j                  j                   j#                          | j%                          y )NzKA child process terminated abruptly, the process pool is not usable anymoreTz^A process in the process pool was terminated abruptly while the future was running or pending.z
'''
r:   z''')r   _brokenr   BrokenProcessPoolr1   r)   rB   r[   r(   rF   rd   r   r   r   	terminater   r   r   r   )r   r   r   bperO   rh   r   s          r   r   z'_ExecutorManagerThread.terminate_broken  s    **,!1H )-H%H   !6 7 ,"''%.)-/CM #'"9"9"?"?"A 	GY**3/	 	%%' &&( 	AKKM	
 	%%' 	$$&r   c                 d   | j                         }|}d|_        |j                  rii }| j                  j	                         D ]%  \  }}|j
                  j                         r!|||<   ' || _        	 	 | j                  j                          y y y # t        j                  $ r Y nw xY wd|_        $r   )r   r   _cancel_pending_futuresr[   r(   rF   cancelr   
get_nowaitr   r   )r   r   new_pending_work_itemsrO   rh   s        r   r   z2_ExecutorManagerThread.flag_executor_shutting_down  s     **,(,H%// *,&*.*A*A*G*G*I D&GY$++224:C.w7D +A' ++668  0    !;;  490s   3B B'&B'c                 ,   | j                         }d}||k  rc| j                         dkD  rOt        ||z
        D ]#  }	 | j                  j                  d        |dz  }% ||k  r| j                         dkD  rMy y y y # t        j
                  $ r Y  3w xY w)Nr   r.   )get_n_children_aliveranger   
put_nowaitr   Full)r   n_children_to_stopn_sentinels_sentis       r   shutdown_workersz'_ExecutorManagerThread.shutdown_workers  s    !668  "44--/!3-0@@A OO..t4$)$  "44--/!3 53 5 zz s    A<<BBc                 `   | j                          | j                  j                          | j                  j                          | j                  5  | j
                  j                          d d d        | j                  j                         D ]  }|j                           y # 1 sw Y   9xY wr   )	r   r   r   join_threadr\   r+   r   r   r)   r   r   s     r   r   z._ExecutorManagerThread.join_executor_internals%  s    ##% 	'$$&	' &&( 	AFFH			' 	's   B$$B-c                 V    t        d | j                  j                         D              S )Nc              3   <   K   | ]  }|j                           y wr   )is_alive).0r   s     r   	<genexpr>z>_ExecutorManagerThread.get_n_children_alive.<locals>.<genexpr>3  s     AA1::<As   )sumr   r   r   s    r   r   z+_ExecutorManagerThread.get_n_children_alive1  s     A)>)>)@AAAr   )r    r!   r"   r   r   r   r   r   r   r   r   r   r   r   ri   rj   s   @r   r   r     sD    	-^+Z.->D..('T94
Br   r   c                     t         rt        rt        t              da 	 dd l} 	 t        j                  d      }|dk(  ry |dk\  ry d|z  at        t              # t        $ r dat        t              w xY w# t        t        f$ r Y y w xY w)NTr   zxThis Python build lacks multiprocessing.synchronize, usually due to named semaphores being unavailable on this platform.SC_SEM_NSEMS_MAX   z@system provides too few semaphores (%d available, 256 necessary))	_system_limits_checked_system_limitedNotImplementedErrormultiprocessing.synchronizeImportErrorr   sysconfAttributeError
ValueError)multiprocessing	nsems_maxs     r   _check_system_limitsr   :  s    %o66!3*JJ12	 B 	C 	46?@O
o
..+  3F 	 "/223 J' s   A A7 A47B	B	c              #   l   K   	 | D ]*  }|j                          |s|j                          |r, y wr   )reverserc   )iterableelements     r   _chain_from_iterable_of_listsr   Z  s:     
   ++-  s   444c                       e Zd Zy)r   N)r    r!   r"   r#   r   r   r   r   f  s    r   r   c                        e Zd Z	 	 ddddZd Zd Zd Zd Zd Ze	j                  j                  j                  e_        dd	d
 fd
ZddddZe	j                  j                  j                  e_         xZS )ProcessPoolExecutorN)r   c                   	 t                |Pt        j                         xs d| _        t        j
                  dk(  ret        t        | j                        | _        nE|dk  rt        d      t        j
                  dk(  r|t        kD  rt        dt               || _        |,|t        j                  d      }nt        j                         }|| _        | j                  j                  d      d	k7  | _        |t        |      st        d
      || _        || _        |Ut%        |t&              st        d      |dk  rt        d      | j                  j                  d      d	k(  rt        d      || _        d | _        i | _        d| _        t1        j2                         | _        t1        j6                  d      | _        d| _        d| _        i | _        d| _         tC               | _"        | j                  tF        z   }tI        || j                  | j>                  | j4                  | jD                        | _%        d| jJ                  _&        |jO                         | _(        tS        jT                         | _+        y )Nr.   win32r   z"max_workers must be greater than 0zmax_workers must be <= spawnF)
allow_noneforkzinitializer must be a callablez&max_tasks_per_child must be an integerz max_tasks_per_child must be >= 1zpmax_tasks_per_child is incompatible with the 'fork' multiprocessing start method; supply a different mp_context.)r^   rZ   r[   r\   r+   T),r   r   	cpu_count_max_workerssysplatformmin_MAX_WINDOWS_WORKERSr   r   get_context_mp_contextget_start_method#_safe_to_dynamically_spawn_childrencallable	TypeError_initializer	_initargsra   r   r   _executor_manager_threadr   r   	threadingLockr   	Semaphorer   r   _queue_countr   r   r   r   EXTRA_QUEUED_CALLSrX   r   _ignore_epipeSimpleQueuer   r   r   r   )r   max_workers
mp_contextr   r   r   
queue_sizes          r   r   zProcessPoolExecutor.__init__n  sf   	$ 	 " 3!D||w&$'(<(,(9(9%;! a !EFF,,')22 -.B-CDF F !,D".^^G4
^^-
%   11U1CvM 	0 "8K+@<=='!*137 HII$) !CDD00E0BfL  "C D D %8! )-%  !&'nn.&/&9&9!&<##% ',$ 0=, &&);;
%T%5%5#77-->>	@ *.&'335r   c                     | j                   d| j                  s| j                          t        |       | _         | j                   j	                          | j
                  t        | j                   <   y y r   )r  r  _launch_processesr   startr   r'   r   s    r   _start_executor_manager_threadz2ProcessPoolExecutor._start_executor_manager_thread  s`    ((0;;&&(,B4,HD)))//144 T::; 1r   c                     | j                   j                  d      ry t        | j                        }|| j                  k  r| j                          y y )NF)blocking)r   acquirelenr   r  _spawn_process)r   process_counts     r   r   z)ProcessPoolExecutor._adjust_process_count  sK    &&...>DOO,4,,, ! -r   c                     t        t        | j                        | j                        D ]  }| j	                           y r   )r   r#  r   r  r$  )r   r*   s     r   r  z%ProcessPoolExecutor._launch_processes  s5    
 s4??+T->->? 	"A!	"r   c                    | j                   j                  t        | j                  | j                  | j
                  | j                  | j                  f      }|j                          || j                  |j                  <   y )N)targetrH   )r
  Processr   r   r   r  r  r   r  r   pidr   s     r   r$  z"ProcessPoolExecutor._spawn_process  sm    $$"""$$##..++	- % . 	
	!"r   c                R   | j                   5  | j                  rt        | j                        | j                  rt	        d      t
        rt	        d      t        j                         }t        ||||      }|| j                  | j                  <   | j                  j                  | j                         | xj                  dz  c_
        | j                  j                          | j                  r| j!                          | j#                          |cd d d        S # 1 sw Y   y xY w)Nz*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdownr.   )r   r   r   r   RuntimeErrorr%   r   FuturerD   r   r  r   ry   r   r   r  r   r  )r   rG   rH   rI   fws         r   submitzProcessPoolExecutor.submit  s       	||'55$$"#OPP" $: ; ; A!Rv.A:;D$$T%6%67NNt001"0077977**,//1+	 	 	s   DDD&r.   )timeoutrp   c                    	 |dk  rt        d      t        | 	  t        t        |      t        |d|i|      }t        |      S )Nr.   zchunksize must be >= 1.rp   )r1  )r   r]   mapr   rv   rt   r   )r   rG   r1  rp   rq   resultsr_   s         r   r3  zProcessPoolExecutor.map  sV    	( q=677'+gnb9)9J	J&-  / -W55r   F)cancel_futuresc                   | j                   5  || _        d| _        | j                  | j                  j	                          d d d        | j
                  |r| j
                  j                          d | _        d | _        | j                  |r| j                  j                          d | _        d | _
        d | _        y # 1 sw Y   }xY wr   )r   r   r   r   r   r  r)   r   r   r   r   )r   r   r5  s      r   shutdownzProcessPoolExecutor.shutdown;  s       	>+9D($(D!33?44;;=	> ((4))..0 )-%)d$$&!/3,#	> 	>s   5B>>C)NNNr#   )T)r    r!   r"   r   r  r   r  r$  r0  r   Executor__doc__r3  r7  ri   rj   s   @r   r   r   m  s~    48,.i'GKi'V5""	#. ^^**22FN*.! 6:4E 4( ~~..66Hr   r   rS   r   )1
__author__r   concurrent.futuresr   r   r   r   multiprocessing.connectionmultiprocessing.queuesr   r  r   	functoolsr   rn   r  	tracebackr   WeakKeyDictionaryr'   r%   r   r-   _register_atexitr  r  	Exceptionr1   r8   r?   objectrD   rM   rU   rX   rt   rv   r|   r   Threadr   r   r   r   r   BrokenExecutorr   r8  r   r#   r   r   <module>rF     s?  (T 2
 	 $   " (     
 & -7,,.  * ** 	  < (    y 	1 	1 !& ! 3 32	) DH"	93l_BY-- _BD	  /@	 ,, b7%.. b7r   