U
    \Sh                     @  s   d 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m	Z	m
Z
mZ zddlZdZW n ek
rp   dZY nX ddlmZ dd	lmZ eeZeoejd
kZG dd dZG dd dZddddddddZdS )zParallel building utilities.    )annotationsN)sqrt)AnyCallableSequenceTF)SphinxParallelError)loggingposixc                   @  sF   e Zd ZdZddddddZdd	d
dddddZddddZdS )SerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.   intNonenprocreturnc                 C  s   d S N selfr   r   r   G/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/util/parallel.py__init__   s    zSerialTasks.__init__Nr   r   Callable | None	task_funcargresult_funcr   c                 C  s(   |d k	r||}n| }|r$|| d S r   r   )r   r   r   r   resr   r   r   add_task    s
    
zSerialTasks.add_taskr   c                 C  s   d S r   r   r   r   r   r   join*   s    zSerialTasks.join)r   )NN)__name__
__module____qualname____doc__r   r   r    r   r   r   r   r
      s      
r
   c                   @  st   e Zd ZdZdddddZddddd	d
dZddddddddZddddZddddZddddZ	dS )ParallelTasksz1Executes *nproc* tasks in parallel after forking.r   r   r   c                 C  s4   || _ i | _i | _i | _i | _i | _d| _d| _d S )Nr   )r   _result_funcs_args_procs_precvs_precvsWaiting	_pworking_taskidr   r   r   r   r   1   s    zParallelTasks.__init__r   r   )pipefuncr   r   c           	   
   C  s   z<t  }|  |d kr$| }n||}W 5 Q R X d}W nH tk
r } z*d}t|j|d  }|t f}W 5 d }~X Y nX t 	|j
 |||j
|f d S )NFTr   )r   ZLogCollectorZcollectBaseException	tracebackformat_exception_only	__class__strip
format_excZconvert_serializablelogssend)	r   r-   r.   r   	collectorretZfailederrerrmsgr   r   r   _processB   s    
zParallelTasks._processNr   r   c           	      C  s~   | j }|  j d7  _ |pdd | j|< || j|< td\}}td}|j| j|||fd}|| j|< || j	|< | 
  d S )Nr   c                 S  s   d S r   r   )r   resultr   r   r   <lambda>W       z(ParallelTasks.add_task.<locals>.<lambda>Ffork)targetargs)r,   r&   r'   multiprocessingZPipeZget_contextProcessr;   r(   r*   	_join_one)	r   r   r   r   tidZprecvZpsendcontextprocr   r   r   r   R   s    



zParallelTasks.add_taskr   c                 C  s.   z| jr|  std qW 5 |    X d S )Ng{Gz?)	terminater+   rD   timesleepr   r   r   r   r    `   s
    zParallelTasks.joinc                 C  sT   t | jD ]D}| j|   | j| | j| | j| |  jd8  _q
d S )Nr   )listr)   r(   rH   r&   popr+   )r   rE   r   r   r   rH   i   s    zParallelTasks.terminateboolc           
      C  s   d}| j  D ]\}}| r| \}}}|r8t| |D ]}t| q<| j|| j	|| | j
|   | j | |  jd8  _d} qq| jr| j| jk r| j \}}	|	| j |< | j
|   |  jd7  _q|S )NFr   T)r)   itemspollrecvr   loggerhandler&   rL   r'   r(   r    r+   r*   r   popitemstart)
r   Z
joined_anyrE   r-   excr5   r<   logZnewtidZnewprecvr   r   r   rD   q   s(    
zParallelTasks._join_one)NN)
r!   r"   r#   r$   r   r;   r   r    rH   rD   r   r   r   r   r%   .   s      	r%   
   zSequence[str]r   z	list[Any])	argumentsr   maxbatchr   c                   sj   t  }|| |kr,tt|| | dkr8dt|\}}|rR|d7 } fddt|D S )Nr   r   c                   s$   g | ]} | |d    qS )r   r   ).0irX   	chunksizer   r   
<listcomp>   s     zmake_chunks.<locals>.<listcomp>)lenr   r   divmodrange)rX   r   rY   nargsZnchunksrestr   r\   r   make_chunks   s    rd   )rW   )r$   
__future__r   osrI   r0   mathr   typingr   r   r   rB   ZHAS_MULTIPROCESSINGImportErrorZsphinx.errorsr   Zsphinx.utilr   	getLoggerr!   rQ   nameZparallel_availabler
   r%   rd   r   r   r   r   <module>   s$   

\