
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,azn  ã                   @   s�  d Z ddlZddlZddlm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 ddlZddlZddlZe ¡ ZdaG dd	„ d	ƒZd
d„ Z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$d0d d!„Z%d"d#„ Z&d$d%„ Z'd&d'„ Z(da)da*d(d)„ Z+d*d+„ Z,G d,d-„ d-ej-ƒZ.G d.d/„ d/ej/ƒZ0e 1e¡ dS )1z"Brian Quinlan (brian@sweetapp.com)é    N)Ú_base)ÚFull)ÚQueue)ÚpartialFc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_ThreadWakeupc                 C   s   t jdd�\| _| _d S )NF)Zduplex)ÚmpZPipeÚ_readerÚ_writer©Úself© r   ú?/opt/alt/python38/lib64/python3.8/concurrent/futures/process.pyÚ__init__R   s    z_ThreadWakeup.__init__c                 C   s   | j  ¡  | j ¡  d S ©N)r	   Úcloser   r
   r   r   r   r   U   s    
z_ThreadWakeup.closec                 C   s   | j  d¡ d S )Nó    )r	   Z
send_bytesr
   r   r   r   ÚwakeupY   s    z_ThreadWakeup.wakeupc                 C   s   | j  ¡ r| j  ¡  q d S r   )r   ZpollZ
recv_bytesr
   r   r   r   Úclear\   s    
z_ThreadWakeup.clearN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   Q   s   r   c                  C   s@   da tt ¡ ƒ} | D ]\}}| ¡  q| D ]\}}| ¡  q*d S ©NT)Ú_global_shutdownÚlistÚ_threads_wakeupsÚitemsr   Újoin)r   Ú_Úthread_wakeupÚtr   r   r   Ú_python_exita   s    
r    é   é=   c                   @   s   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   z   s    z_RemoteTraceback.__init__c                 C   s   | j S r   r$   r
   r   r   r   Ú__str__|   s    z_RemoteTraceback.__str__N)r   r   r   r   r&   r   r   r   r   r#   y   s   r#   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_ExceptionWithTracebackc                 C   s0   t  t|ƒ||¡}d |¡}|| _d| | _d S )NÚ z

"""
%s""")Ú	tracebackÚformat_exceptionÚtyper   Úexcr%   )r   r,   r%   r   r   r   r   €   s    
z _ExceptionWithTraceback.__init__c                 C   s   t | j| jffS r   )Ú_rebuild_excr,   r%   r
   r   r   r   Ú
__reduce__…   s    z"_ExceptionWithTraceback.__reduce__N)r   r   r   r   r.   r   r   r   r   r'      s   r'   c                 C   s   t |ƒ| _| S r   )r#   Ú	__cause__)r,   r%   r   r   r   r-   ˆ   s    
r-   c                   @   s   e Zd Zdd„ ZdS )Ú	_WorkItemc                 C   s   || _ || _|| _|| _d S r   )ÚfutureÚfnÚargsÚkwargs)r   r1   r2   r3   r4   r   r   r   r   �   s    z_WorkItem.__init__N©r   r   r   r   r   r   r   r   r0   Œ   s   r0   c                   @   s   e Zd Zddd„ZdS )Ú_ResultItemNc                 C   s   || _ || _|| _d S r   )Úwork_idÚ	exceptionÚresult)r   r7   r8   r9   r   r   r   r   ”   s    z_ResultItem.__init__)NNr5   r   r   r   r   r6   “   s   r6   c                   @   s   e Zd Zdd„ ZdS )Ú	_CallItemc                 C   s   || _ || _|| _|| _d S r   )r7   r2   r3   r4   )r   r7   r2   r3   r4   r   r   r   r   š   s    z_CallItem.__init__Nr5   r   r   r   r   r:   ™   s   r:   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Úsuperr   )r   Úmax_sizer<   r=   ©Ú	__class__r   r   r   £   s    z_SafeQueue.__init__c                    sl   t |tƒrZt t|ƒ||j¡}td d |¡¡ƒ|_	| j
 |jd ¡}|d k	rh|j |¡ ntƒ  ||¡ d S )Nz

"""
{}"""r(   )Ú
isinstancer:   r)   r*   r+   Ú__traceback__r#   Úformatr   r/   r=   Úpopr7   r1   Úset_exceptionr>   Ú_on_queue_feeder_error)r   ÚeÚobjr%   Ú	work_itemr@   r   r   rG   §   s    
z!_SafeQueue._on_queue_feeder_error)r   )r   r   r   r   rG   Ú__classcell__r   r   r@   r   r;   ¡   s   r;   c                 g   s,   t |Ž }tt || ¡ƒ}|s d S |V  qd S r   )ÚzipÚtupleÚ	itertoolsÚislice)Ú	chunksizeÚ	iterablesÚitÚchunkr   r   r   Ú_get_chunks´   s
    rT   c                    s   ‡ fdd„|D ƒS )Nc                    s   g | ]}ˆ |Ž ‘qS r   r   )Ú.0r3   ©r2   r   r   Ú
<listcomp>Æ   s     z"_process_chunk.<locals>.<listcomp>r   )r2   rS   r   rV   r   Ú_process_chunk½   s    	rX   c              
   C   s^   z|   t|||d�¡ W n@ tk
rX } z"t||jƒ}|   t||d�¡ W 5 d }~X Y nX d S )N)r9   r8   ©r8   )Úputr6   ÚBaseExceptionr'   rC   )Úresult_queuer7   r9   r8   rH   r,   r   r   r   Ú_sendback_resultÉ   s    
ÿr]   c              
   C   sÐ   |d k	r<z||Ž  W n& t k
r:   tjjddd� Y d S X | jdd�}|d krb| t ¡ ¡ d S z|j|j	|j
Ž}W n> t k
r´ } z t||jƒ}t||j|d� W 5 d }~X Y nX t||j|d� ~~q<d S )NzException in initializer:T)Úexc_info©ÚblockrY   )r9   )r[   r   ZLOGGERZcriticalÚgetrZ   ÚosÚgetpidr2   r3   r4   r'   rC   r]   r7   )Ú
call_queuer\   ÚinitializerÚinitargsZ	call_itemÚrrH   r,   r   r   r   Ú_process_workerÓ   s$    "rh   c                 C   sv   |  ¡ rd S z|jdd�}W n tjk
r4   Y d S X | | }|j ¡ rh|jt||j|j	|j
ƒdd� q | |= q q d S )NFr_   T)Zfullra   ÚqueueZEmptyr1   Zset_running_or_notify_cancelrZ   r:   r2   r3   r4   )r=   Zwork_idsrd   r7   rJ   r   r   r   Ú_add_call_item_to_queueü   s"    
ýürj   c              
      s>  d ‰‡fdd„}‡ ‡fdd„}|j }	|j }
|	|
g}t||ˆ ƒ dd„ ˆ ¡ D ƒ}tj || ¡}d }d}|	|krºz|	 ¡ }d}W qÊ tk
r¶ } zt 	t
|ƒ||j¡}W 5 d }~X Y qÊX n|
|krÊd}d }| ¡  |�rl| ƒ ‰ˆd k	röd	ˆ_dˆ_d ‰td
ƒ}|d k	�r tdd |¡› d�ƒ|_| ¡ D ]\}}|j |¡ ~�q(| ¡  ˆ ¡ D ]}| ¡  �qR|ƒ  d S t|tƒ�rœˆ |¡}| ¡  ˆ�sè|ƒ  d S nL|d k	�rè| |jd ¡}|d k	�ræ|j�rÖ|j |j¡ n|j |j¡ ~~| ƒ ‰|ƒ �r4z&ˆd k	�rdˆ_|�s|ƒ  W d S W n tk
�r2   Y nX d ‰q2d S )Nc                      s   t pˆ d kpˆ jS r   )r   Ú_shutdown_threadr   )Úexecutorr   r   Úshutting_down@  s    ÿz/_queue_management_worker.<locals>.shutting_downc               	      s¬   t dd„ ˆ ¡ D ƒƒ} | }d}||k rŠ| dkrŠt|| ƒD ]6}zˆ  d ¡ |d7 }W q: tk
rn   Y  qrY q:X q:t dd„ ˆ ¡ D ƒƒ} qˆ  ¡  ˆ ¡ D ]}| ¡  qšd S )Nc                 s   s   | ]}|  ¡ V  qd S r   ©Zis_alive©rU   Úpr   r   r   Ú	<genexpr>F  s     zD_queue_management_worker.<locals>.shutdown_worker.<locals>.<genexpr>r   r!   c                 s   s   | ]}|  ¡ V  qd S r   rn   ro   r   r   r   rq   R  s     )ÚsumÚvaluesÚrangeZ
put_nowaitr   r   r   )Zn_children_aliveZn_children_to_stopZn_sentinels_sentÚirp   )rd   Ú	processesr   r   Úshutdown_workerD  s    
z1_queue_management_worker.<locals>.shutdown_workerc                 S   s   g | ]
}|j ‘qS r   )Úsentinelro   r   r   r   rW   i  s     z,_queue_management_worker.<locals>.<listcomp>TFzKA child process terminated abruptly, the process pool is not usable anymorez^A process in the process pool was terminated abruptly while the future was running or pending.z
'''
r(   z''')r   rj   rs   r   Z
connectionÚwaitZrecvr[   r)   r*   r+   rC   r   Ú_brokenrk   ÚBrokenProcessPoolr#   r   r/   r   r1   rF   Z	terminaterB   ÚintrE   r7   r8   Z
set_resultr9   r   )Zexecutor_referencerv   r=   Zwork_ids_queuerd   r\   r   rm   rw   Zresult_readerZwakeup_readerZreadersZworker_sentinelsZreadyÚcauseZ	is_brokenZresult_itemrH   Zbper7   rJ   rp   r   )rd   rl   rv   r   Ú_queue_management_worker"  sˆ    þ	(
ÿ




r~   c               	   C   sj   t rtrttƒ‚da zt d¡} W n ttfk
r<   Y d S X | dkrJd S | dkrVd S d|  attƒ‚d S )NTÚSC_SEM_NSEMS_MAXéÿÿÿÿé   z@system provides too few semaphores (%d available, 256 necessary))Ú_system_limits_checkedÚ_system_limitedÚNotImplementedErrorrb   ÚsysconfÚAttributeErrorÚ
ValueError)Z	nsems_maxr   r   r   Ú_check_system_limitsÆ  s     ÿrˆ   c                 c   s&   | D ]}|  ¡  |r| ¡ V  qqd S r   )ÚreverserE   )ÚiterableZelementr   r   r   Ú_chain_from_iterable_of_listsÞ  s    r‹   c                   @   s   e Zd ZdS )r{   N)r   r   r   r   r   r   r   r{   ê  s   r{   c                       st   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zejjj	e_	ejjj
e_
dddœ‡ fdd„
Zddd„Zejjj
e_
‡  ZS )ÚProcessPoolExecutorNr   c                 C   s  t ƒ  |d kr6t ¡ pd| _tjdkrntt| jƒ| _n8|dkrHtdƒ‚n tjdkrh|tkrhtdt› �ƒ‚|| _|d kr~t	 
¡ }|| _|d k	rœt|ƒsœtdƒ‚|| _|| _d | _i | _d| _t ¡ | _d| _d| _i | _| jt }t|| j| jd�| _d	| j_| ¡ | _t  ¡ | _!t"ƒ | _#d S )
Nr!   Zwin32r   z"max_workers must be greater than 0zmax_workers must be <= zinitializer must be a callableF)r?   r<   r=   T)$rˆ   rb   Ú	cpu_countÚ_max_workersÚsysÚplatformÚminÚ_MAX_WINDOWS_WORKERSr‡   r   Zget_contextÚ_mp_contextÚcallableÚ	TypeErrorÚ_initializerÚ	_initargsÚ_queue_management_threadÚ
_processesrk   Ú	threadingZLockÚ_shutdown_lockrz   Ú_queue_countÚ_pending_work_itemsÚEXTRA_QUEUED_CALLSr;   Ú_call_queueZ_ignore_epipeZSimpleQueueÚ_result_queueri   r   Ú	_work_idsr   Ú_queue_management_thread_wakeup)r   Zmax_workersZ
mp_contextre   rf   Z
queue_sizer   r   r   r   ò  sP    
ÿ

ÿÿ

 þ

zProcessPoolExecutor.__init__c              	   C   sv   | j d krr| jfdd„}|  ¡  tjtt | |¡| j| j	| j
| j| j| jfdd�| _ d| j _| j  ¡  | jt| j < d S )Nc                 S   s   t j d¡ | ¡  d S )Nz?Executor collected: triggering callback for QueueManager wakeup)r   ÚutilÚdebugr   )r   r   r   r   r   Ú
weakref_cbB  s    zFProcessPoolExecutor._start_queue_management_thread.<locals>.weakref_cbZQueueManagerThread)Útargetr3   ÚnameT)r˜   r¢   Ú_adjust_process_countrš   ZThreadr~   ÚweakrefÚrefr™   r�   r¡   rŸ   r    ZdaemonÚstartr   )r   r¥   r   r   r   Ú_start_queue_management_thread=  s(    
ÿ

ú÷

ÿz2ProcessPoolExecutor._start_queue_management_threadc                 C   sP   t t| jƒ| jƒD ]8}| jjt| j| j| j	| j
fd�}| ¡  || j|j< qd S )N)r¦   r3   )rt   Úlenr™   rŽ   r“   ZProcessrh   rŸ   r    r–   r—   r«   Úpid)r   r   rp   r   r   r   r¨   X  s    ýþz)ProcessPoolExecutor._adjust_process_countc               
   O   s
  t | ƒdkr| ^}}} nV| s&tdƒ‚nHd|krZ| d¡}| ^}} dd l}|jdtdd� ntdt | ƒd  ƒ‚|j�Œ |jr†t|jƒ‚|j	r”t
d	ƒ‚tr t
d
ƒ‚t ¡ }t||| |ƒ}||j|j< |j |j¡ | jd7  _|j ¡  | ¡  |W  5 Q R £ S Q R X d S )Né   zEdescriptor 'submit' of 'ProcessPoolExecutor' object needs an argumentr2   r   z.Passing 'fn' as keyword argument is deprecated)Ú
stacklevelz6submit expected at least 1 positional argument, got %dr!   z*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown)r­   r•   rE   ÚwarningsÚwarnÚDeprecationWarningr›   rz   r{   rk   ÚRuntimeErrorr   r   ZFuturer0   r�   rœ   r¡   rZ   r¢   r   r¬   )r3   r4   r   r2   r±   ÚfÚwr   r   r   Úsubmitc  s<    

 ÿ
ÿ

zProcessPoolExecutor.submitr!   )ÚtimeoutrP   c                   s:   |dk rt dƒ‚tƒ jtt|ƒt|d|iŽ|d�}t|ƒS )Nr!   zchunksize must be >= 1.rP   )r¸   )r‡   r>   Úmapr   rX   rT   r‹   )r   r2   r¸   rP   rQ   Zresultsr@   r   r   r¹   Š  s    þzProcessPoolExecutor.mapTc              	   C   sŠ   | j � d| _W 5 Q R X | jr6| j ¡  |r6| j ¡  d | _| jd k	rd| j ¡  |r^| j ¡  d | _d | _	d | _
| jr†| j ¡  d | _d S r   )r›   rk   r˜   r¢   r   r   rŸ   r   Zjoin_threadr    r™   )r   ry   r   r   r   Úshutdown§  s"    





zProcessPoolExecutor.shutdown)NNNr   )T)r   r   r   r   r¬   r¨   r·   r   ÚExecutorÚ__text_signature__Ú__doc__r¹   rº   rK   r   r   r@   r   rŒ   ñ  s       ÿ
K$
rŒ   )NN)2Ú
__author__Úatexitrb   Zconcurrent.futuresr   ri   r   Zmultiprocessingr   Zmultiprocessing.connectionZmultiprocessing.queuesr   rš   r©   Ú	functoolsr   rN   r�   r)   ÚWeakKeyDictionaryr   r   r   r    rž   r’   Ú	Exceptionr#   r'   r-   Úobjectr0   r6   r:   r;   rT   rX   r]   rh   rj   r~   r‚   rƒ   rˆ   r‹   ZBrokenExecutorr{   r»   rŒ   Úregisterr   r   r   r   Ú<module>.   sT   		

)& ! P