o
     JAf{                     @   s  	 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Ze ZdaG dd dZd	d
 Ze
e dZdZG dd deZG dd dZdd ZG dd deZG dd deZG dd deZ G dd de	Z!dd Z"dd Z#d-dd Z$d!d" Z%G d#d$ d$e
j&Z'da(da)d%d& Z*d'd( Z+G d)d* d*ej,Z-G d+d, d,ej.Z/dS ).z"Brian Quinlan (brian@sweetapp.com)    N)_base)Queue)partialFc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_ThreadWakeupc                 C   s   d| _ tjdd\| _| _d S )NF)duplex)_closedmpPipe_reader_writerself r   1/usr/lib/python3.10/concurrent/futures/process.py__init__C   s   z_ThreadWakeup.__init__c                 C   s(   | j sd| _ | j  | j  d S d S NT)r   r   closer
   r   r   r   r   r   G   s
   
z_ThreadWakeup.closec                 C   s   | j s| jd d S d S )N    )r   r   
send_bytesr   r   r   r   wakeupM   s   z_ThreadWakeup.wakeupc                 C   s0   | j s| j r| j  | j sd S d S d S N)r   r
   poll
recv_bytesr   r   r   r   clearQ   s   

z_ThreadWakeup.clearN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   B   s
    r   c                  C   s@   da tt } | D ]\}}|  q
| D ]\}}|  qd S r   )_global_shutdownlist_threads_wakeupsitemsr   join)r    _thread_wakeuptr   r   r   _python_exitW   s   

r%      =   c                   @      e Zd Zdd Zdd ZdS )_RemoteTracebackc                 C   s
   || _ d S r   tb)r   r+   r   r   r   r   w   s   
z_RemoteTraceback.__init__c                 C   s   | j S r   r*   r   r   r   r   __str__y   s   z_RemoteTraceback.__str__N)r   r   r   r   r,   r   r   r   r   r)   v   s    r)   c                   @   r(   )_ExceptionWithTracebackc                 C   s8   t t|||}d|}|| _d | j_d| | _d S )N z

"""
%s""")	tracebackformat_exceptiontyper!   exc__traceback__r+   )r   r2   r+   r   r   r   r   }   s
   
z _ExceptionWithTraceback.__init__c                 C   s   t | j| jffS r   )_rebuild_excr2   r+   r   r   r   r   
__reduce__   s   z"_ExceptionWithTraceback.__reduce__N)r   r   r   r   r5   r   r   r   r   r-   |   s    r-   c                 C   s   t || _| S r   )r)   	__cause__)r2   r+   r   r   r   r4      s   
r4   c                   @      e Zd Zdd ZdS )	_WorkItemc                 C      || _ || _|| _|| _d S r   )futurefnargskwargs)r   r:   r;   r<   r=   r   r   r   r         
z_WorkItem.__init__Nr   r   r   r   r   r   r   r   r8          r8   c                   @   s   e Zd ZdddZdS )_ResultItemNc                 C   s   || _ || _|| _d S r   )work_id	exceptionresult)r   rB   rC   rD   r   r   r   r      s   
z_ResultItem.__init__NNr?   r   r   r   r   rA      s    rA   c                   @   r7   )	_CallItemc                 C   r9   r   )rB   r;   r<   r=   )r   rB   r;   r<   r=   r   r   r   r      r>   z_CallItem.__init__Nr?   r   r   r   r   rF      r@   rF   c                       s,   e Zd Z	 d fdd	Z fddZ  ZS )
_SafeQueuer   c                   s&   || _ || _|| _t j||d d S )N)ctx)pending_work_itemsshutdown_lockr#   superr   )r   max_sizerH   rI   rJ   r#   	__class__r   r   r      s   z_SafeQueue.__init__c                    s   t |trHtt|||j}tdd||_	| j
|jd }| j | j  W d    n1 s5w   Y  |d urF|j| d S d S t || d S )Nz

"""
{}"""r.   )
isinstancerF   r/   r0   r1   r3   r)   formatr!   r6   rI   poprB   rJ   r#   r   r:   set_exceptionrK   _on_queue_feeder_error)r   eobjr+   	work_itemrM   r   r   rS      s   
z!_SafeQueue._on_queue_feeder_error)r   )r   r   r   r   rS   __classcell__r   r   rM   r   rG      s    rG   c                 g   s.    	 t | }	 tt|| }|sd S |V  qr   )ziptuple	itertoolsislice)	chunksize	iterablesitchunkr   r   r   _get_chunks   s   r`   c                    s   	  fdd|D S )Nc                    s   g | ]} | qS r   r   ).0r<   r;   r   r   
<listcomp>   s    z"_process_chunk.<locals>.<listcomp>r   )r;   r_   r   rb   r   _process_chunk   s   rd   c              
   C   sb   	 z|  t|||d W d S  ty0 } zt||j}|  t||d W Y d }~d S d }~ww )N)rD   rC   rC   )putrA   BaseExceptionr-   r3   )result_queuerB   rD   rC   rT   r2   r   r   r   _sendback_result   s   
 ri   c              
   C   s   	 |d urz||  W n t y   tjjddd Y d S w 	 | jdd}|d u r2|t  d S z|j|j	i |j
}W n  t y^ } zt||j}t||j|d W Y d }~nd }~ww t||j|d ~~q)NzException in initializer:T)exc_infoblockre   )rD   )rg   r   LOGGERcriticalgetrf   osgetpidr;   r<   r=   r-   r3   ri   rB   )
call_queuerh   initializerinitargs	call_itemrrT   r2   r   r   r   _process_worker   s0   rw   c                       sn   e Zd Z	  fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z  ZS )_ExecutorManagerThreadc                    sf   |j | _|j| _| j| jfdd}t||| _|j| _|j	| _
|j| _|j| _|j| _t   d S )Nc                 S   s>   t jd | |  W d    d S 1 sw   Y  d S )Nz?Executor collected: triggering callback for QueueManager wakeup)r   utildebugr   )r"   r#   rJ   r   r   r   
weakref_cb  s   
"z3_ExecutorManagerThread.__init__.<locals>.weakref_cb)_executor_manager_thread_wakeupr#   _shutdown_lockrJ   weakrefrefexecutor_reference
_processes	processes_call_queuerr   _result_queuerh   	_work_idswork_ids_queue_pending_work_itemsrI   rK   r   )r   executorr{   rM   r   r   r     s   	
z_ExecutorManagerThread.__init__c                 C   s~   	 |    |  \}}}|r| | d S |d ur-| | ~|  }|d ur,|j  ~|  r>|   | j	s>| 
  d S qr   )add_call_item_to_queuewait_result_broken_or_wakeupterminate_brokenprocess_result_itemr   _idle_worker_semaphorereleaseis_shutting_downflag_executor_shutting_downrI   join_executor_internals)r   result_item	is_brokencauser   r   r   r   run:  s&   


z_ExecutorManagerThread.runc                 C   s|   	 | j  rd S z	| jjdd}W n tjy   Y d S w | j| }|j r8| j j	t
||j|j|jdd n| j|= q q)NTFrk   )rr   fullr   ro   queueEmptyrI   r:   set_running_or_notify_cancelrf   rF   r;   r<   r=   )r   rB   rV   r   r   r   r   Z  s(   



z-_ExecutorManagerThread.add_call_item_to_queuec           
   
   C   s   | j j}| jj}||g}dd t| j D }tj|| }d }d}d }||v rOz|	 }d}W n" t
yN }	 ztt|	|	|	j}W Y d }	~	nd }	~	ww ||v rUd}| j | j  W d    n1 shw   Y  |||fS )Nc                 S   s   g | ]}|j qS r   )sentinelra   pr   r   r   rc   {  s    zG_ExecutorManagerThread.wait_result_broken_or_wakeup.<locals>.<listcomp>TF)rh   r
   r#   r   r   valuesr   
connectionwaitrecvrg   r/   r0   r1   r3   rJ   r   )
r   result_readerwakeup_readerreadersworker_sentinelsreadyr   r   r   rT   r   r   r   r   q  s,    
z3_ExecutorManagerThread.wait_result_broken_or_wakeupc                 C   sz   t |tr| j|}|  | js|   d S d S | j|jd }|d ur;|jr2|j	
|j d S |j	|j d S d S r   )rO   intr   rQ   r!   r   rI   rB   rC   r:   rR   
set_resultrD   )r   r   r   rV   r   r   r   r     s   
z*_ExecutorManagerThread.process_result_itemc                 C   s   |   }tp|d u p|jS r   )r   r   _shutdown_thread)r   r   r   r   r   r     s   z'_ExecutorManagerThread.is_shutting_downc                 C   s   |   }|d urd|_d|_d }td}|d ur$tdd| d|_| j D ]\}}|j	
| ~q)| j  | j D ]}|  q?|   d S )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   BrokenProcessPoolr)   r!   r6   rI   r    r:   rR   r   r   r   	terminater   )r   r   r   bperB   rV   r   r   r   r   r     s"   

z'_ExecutorManagerThread.terminate_brokenc                 C   s   |   }|d ur?d|_|jrAi }| j D ]\}}|j s"|||< q|| _	 z| j  W n
 t	j
y8   Y nw q'd|_d S d S d S )NTF)r   r   _cancel_pending_futuresrI   r    r:   cancelr   
get_nowaitr   r   )r   r   new_pending_work_itemsrB   rV   r   r   r   r     s(   

z2_ExecutorManagerThread.flag_executor_shutting_downc              	   C   s   |   }d}||k r<|   dkr>t|| D ]}z| jd  |d7 }W q tjy/   Y  nw ||k r@|   dksd S d S d S d S )Nr   r&   )get_n_children_aliverangerr   
put_nowaitr   Full)r   n_children_to_stopn_sentinels_sentir   r   r   shutdown_workers  s    z'_ExecutorManagerThread.shutdown_workersc                 C   sh   |    | j  | j  | j | j  W d    n1 s!w   Y  | j D ]}|  q+d S r   )	r   rr   r   join_threadrJ   r#   r   r   r!   r   r   r   r   r   r     s   


z._ExecutorManagerThread.join_executor_internalsc                 C   s   t dd | j D S )Nc                 s   s    | ]}|  V  qd S r   )is_aliver   r   r   r   	<genexpr>  s    z>_ExecutorManagerThread.get_n_children_alive.<locals>.<genexpr>)sumr   r   r   r   r   r   r     s   z+_ExecutorManagerThread.get_n_children_alive)r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   rM   r   rx     s    + 
&rx   c               	   C   s   t rtrttda zdd l} W n ty   dattw ztd}W n ttfy1   Y d S w |dkr8d S |dkr>d S d| att)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ImportErrorrp   sysconfAttributeError
ValueError)multiprocessing	nsems_maxr   r   r   _check_system_limits  s0   r   c                 c   s,    	 | D ]}|   |r| V  |sqd S r   )reverserQ   )iterableelementr   r   r   _chain_from_iterable_of_lists4  s   
r   c                   @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   @  s    r   c                       s   e Zd Z		dddZdd Zdd Zd	d
 Zdd Zdd Ze	j
jje_ddd fdd
ZdddddZe	j
jje_  ZS )ProcessPoolExecutorNr   c                 C   sJ  	 t   |d u rt pd| _tjdkrtt| j| _n|dkr$tdtjdkr4|tkr4tdt || _|d u r?t	
 }|| _| jjdddk| _|d urXt|sXtd	|| _|| _d | _i | _d| _t | _td| _d| _d| _i | _d| _t | _| jt  }t!|| j| j| j| jd
| _"d| j"_#|$ | _%t&' | _(d S )Nr&   win32r   z"max_workers must be greater than 0zmax_workers must be <= F)
allow_noneforkzinitializer must be a callable)rL   rH   rI   rJ   r#   T))r   rp   	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	_initargs_executor_manager_threadr   r   	threadingLockr}   	Semaphorer   r   _queue_countr   r   r   r|   EXTRA_QUEUED_CALLSrG   r   _ignore_epipeSimpleQueuer   r   r   r   )r   max_workers
mp_contextrs   rt   
queue_sizer   r   r   r   H  s\   





zProcessPoolExecutor.__init__c                 C   s@   | j d u r| js|   t| | _ | j   | jt| j < d S d S r   )r   r   _launch_processesrx   startr|   r   r   r   r   r   _start_executor_manager_thread  s   


z2ProcessPoolExecutor._start_executor_manager_threadc                 C   s6   | j jddr	d S t| j}|| jk r|   d S d S )NF)blocking)r   acquirelenr   r   _spawn_process)r   process_countr   r   r   _adjust_process_count  s   

z)ProcessPoolExecutor._adjust_process_countc                 C   s$   t t| j| jD ]}|   q	d S r   )r   r   r   r   r   )r   r"   r   r   r   r     s   
z%ProcessPoolExecutor._launch_processesc                 C   s8   | j jt| j| j| j| jfd}|  || j|j	< d S )N)targetr<   )
r   Processrw   r   r   r   r   r   r   pidr   r   r   r   r     s   z"ProcessPoolExecutor._spawn_processc                O   s   | j N | jrt| j| jrtdtrtdt }t||||}|| j	| j
< | j| j
 |  j
d7  _
| j  | jrD|   |   |W  d    S 1 sTw   Y  d S )Nz*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdownr&   )r}   r   r   r   RuntimeErrorr   r   Futurer8   r   r   r   rf   r|   r   r   r   r   )r   r;   r<   r=   fwr   r   r   submit  s$   

$zProcessPoolExecutor.submitr&   )timeoutr\   c                   s<   	 |dk r	t dt jtt|t|d|i|d}t|S )Nr&   zchunksize must be >= 1.r\   )r   )r   rK   mapr   rd   r`   r   )r   r;   r   r\   r]   resultsrM   r   r   r     s   zProcessPoolExecutor.mapTF)cancel_futuresc                C   s   | j  || _d| _| jd ur| j  W d    n1 sw   Y  | jd ur/|r/| j  d | _d | _| jd urA|rA| j	  d | _d | _
d | _d S r   )r}   r   r   r|   r   r   r!   r   r   r   r   )r   r   r  r   r   r   shutdown  s    




zProcessPoolExecutor.shutdown)NNNr   )T)r   r   r   r   r   r   r   r   r   r   Executor__doc__r   r  rW   r   r   rM   r   r   G  s    
U

r   rE   )0
__author__rp   concurrent.futuresr   r   r   r   multiprocessing.connectionmultiprocessing.queuesr   r   r~   	functoolsr   rZ   r   r/   WeakKeyDictionaryr   r   r   r%   _register_atexitr   r   	Exceptionr)   r-   r4   objectr8   rA   rF   rG   r`   rd   ri   rw   Threadrx   r   r   r   r   BrokenExecutorr   r  r   r   r   r   r   <module>   sR   *



)   